Шаблон для работы с несколькими операциями ввода-вывода в Node.js - PullRequest
0 голосов
/ 14 августа 2011

Предположим, у меня есть приложение CMS, написанное на Node.js, которое сохраняет данные в базе данных Redis.Когда это приложение создает новое содержимое, оно должно увеличить счетчик идентификаторов, добавить новый идентификатор в список идентификаторов и затем установить новый хэш с содержимым.На данный момент я бы создал функцию для выполнения этого выполнения.Эта функция (назовем ее createArticle()) будет иметь обратный вызов и будет выполнять приращение.После выполнения приращения функция обратного вызова помещает его в список идентификаторов.После этого другой обратный вызов создаст хеш.Обратный вызов, создающий хеш, вызвал бы функцию, переданную в качестве параметра createArticle():

function createArticle(title, content, callback) {
    var client = redis.createClient();
    client.incr("idCounter", function(err, id) {
        if (err) return callback(err, data);
        client.lpush("articleIds", id, function (err, data) {
            if (err) return callback(err, data);
            var key = "article:"+id;
            client.hmset(key, "title", title, "content", content, callback);
        });
    });
}

Я бы использовал эту функцию более или менее таким образом (используя Express в этом примере):

app.post('/createarticle', function(req, res) {
    var title = req.body.article.title, 
        content = req.body.article.content;
    createArticle(title, content, function(err, data) {
        if (err) return res.render('error', { status: 500, message: 'Internal Server Error' });
        res.render('index', { status: 200, message: 'Article created!' });
    });
});

Однако этот код выглядит немного громоздким для меня.Это путь?Или есть лучший способ сделать серию шагов ввода / вывода?В моем примере я использовал Express и Redis, но для ответа не нужно их использовать.

1 Ответ

1 голос
/ 14 августа 2011

Вы можете сделать эти ловушки ошибок однострочными:

function createArticle(title, content, callback) {
    var client = redis.createClient()
    client.incr("idCounter", function(err, id) {
        if (err) return callback(err, data)
        client.lpush("articleIds", id, function (err, data) {
            if (err) return callback(err, data)
            var key = "article:"+id
            client.hmset(key, "title", title, "content", content", callback)
        })
    })
}

И вы можете использовать помощника для обработки ошибок:

function noError(errorCb, cb) {
    var slice = Array.prototype.slice
    return function (err) {
        var currentCb = err ? errorCb : cb
        currentCb.apply(this, slice.apply(arguments, err?0:1)
    }
}

function createArticle(title, content, cb) {
    var client = redis.createClient()
    client.incr("idCounter", noError(cb, function(id) {
        client.lpush("articleIds", id, noError(function (data) {
            var key = "article:"+id
            client.hmset(key, "title", title, "content", content", callback)
        }))
    })
}

или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...