在Node.js中处理多个I/O操作的模式

Pattern for dealing with multiple I/O operations in Node.js

本文关键字:操作 模式 js Node 处理      更新时间:2023-09-26

假设我有一个用Node.js编写的CMS应用程序,它在Redis数据库上持久化数据。当此应用程序创建新内容时,它应该增加id计数器,将新id添加到ide列表中,然后使用内容设置新的散列。我现在要做的是创建一个函数来执行这个执行。这个函数(让我们称之为createArticle())将有一个回调,并执行增量。一旦执行了增量,回调函数将把它推入id列表。之后,另一个回调将创建散列。创建哈希的回调将调用作为参数传递给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!' });
    });
});

然而,这段代码对我来说有点麻烦。这条路对吗?或者是否有更好的方法来执行一系列I/O步骤?我在我的例子中使用了Express和Redis,但答案不需要使用它们。

您可以将这些错误捕获器设置为单行:

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)
        }))
    })
}

或者类似的