Задать вопрос
Ответы пользователя по тегу Компьютерные сети
  • Существуют ли ORM с возможностью работы поверх HTTP на Node.js?

    Если монго будете выбирать, вот пример для [Class](https://github.com/atmajs/classjs). Правда http сервис нужно отдельно писать, но в основном это и так надо, потому что редко можно обойтись CRUD методами, обычно логика поведения посложнее.
    // entity/user.js
    var User = Class('User', {
        Base: Class.Serializable({
            activity: Date
        }),
        Validate: {
            activity (date) {
                if (date.getFullYear() !== new Date().getFullYear()) 
                    return 'Current year expected';
            }
        },
        _id: null,
        activity: null,
        points: 0,
    });
    // client/user.js
    Class.patch('User', {
        Store: Class.Remote('/rest/user/:_id')
    })
    // server/user.js
    Class.patch('User', {
        Store: Class.MongoStore.Single('users', {
            indexes: [ { date: 1} ]
        })
    });
    
    // Browser OR NodeJS
    var user = new User({
        _id: 'foo',
        activity: new Date
    });
    user.save().done(() => {});
    //
    user
        .patch({
            $inc: {
                points: 2
            }
        })
        .done(() => {})
    //
    User.fetch({ _id: 'foo' }).done(user => {});
    User.fetch({ points: '>10' }).done(user => {});
    
    // Server, http endpoint sample
    module.exports = atma.server.Service({
        '$post /' (req) {
            var user = new User(req.body),
                error = Class.validate(user);
            if (error) 
                return this.reject(error);
            
            user.save().pipe(this);
        }
    })
    Ответ написан
    Комментировать
  • Как заставить http.get (NodeJS) работать синхронно?

    К тому же `http` в ноде асинхронное, поэтому нужен `callback` или `promise`. А ещё нужно код отрефакторить. Вот навскидку:
    var Request = require('request'),
        Class = require('atma-class');
    module.exports = function prepareTiles(tiles, url, ssid, callback) {
    
        var await = new Class.Await();
        tiles.forEach(function(tile) {
            prepareTile(tile, url, ssid, await.delegate());
        });
        await.always(function(){
            callback(tiles);
        });
    };
    
    function prepairTile(tile, url, ssid, callback) {
        var meta = title.metadata;
        switch (meta.tiletype) {
            case 'mark':
                var search = qs.stringify({
                    url: url,
                    ssid: ssid,
                    mark: meta.mark,
                    type: meta.type,
                    format: meta.format,
                    graph: meta.graph
                });
                val_resolve(
                    'http://127.0.0.1:8080/getSingleMark?' + search
                    , tile
                    , callback);
                break;
            case 'youtube':
            case 'telcall':
            case 'skypecall':
                val_onComplete(tile, meta, callback);
                break;
        }
    }
    
    function val_resolve(url, tile, callback) {
        Request.get(url, function(error, res, body) {
            if (error)
                console.error(error)
            val_onComplete(tile, body, callback);
        });
    }
    
    function val_onComplete(tile, model, callback) {
        tile.metadata.value = tpl.make(
            tile.metadata.tiletype, model
        );
        callback();
    }
    Ответ написан
    1 комментарий