1

大家好,这是我的代码:

function get_group(req, res, next) {
var send_result = function(err, group_list) {
[...]
    res.send(group_list);
    return next();
};

Group.findOne({'_id': req.params._id}, send_result);

}

现在我如何使用 async.series 实现异步库 (caolan) 并将 findOne() 与 send_result 结合起来,因为它的代码对我来说看起来很杂乱无章。

编辑1

我使用了这个策略,但我不确定是否正确,有什么建议吗?

function get_group(req, res, next) {
async.waterfall([
    function(callback) {
        Group.findOne({'_id': req.params._id}, callback);
    }
],
function (err, group_list){
    res.send(group_list);
    return next();
});

}

有什么建议吗?

4

1 回答 1

2

对于他们在 Express.js 中所谓的路由,您实际上几乎不需要使用异步库。原因是路由实际上是它们自身的一种控制流。它们采用任意数量的中间件,因此您可以将路由划分为小代码块。

例如,假设您想从数据库中获取一个记录/文档对其进行处理,然后将其作为 json 发送。然后您可以执行以下操作:

var getOne = function(req, res, next){
    db.one( 'some id', function(err, data){
        if (err){
            return next( { type: 'database', error: err } );
        };

        res.local( 'product', data );
        next();
    });
};

var transformProduct = function(req, res, next){
    var product = res.locals().product;

    transform( product, function(data){
        res.local('product', data);
        next();
    });
};

var sendProduct = function(req, res, next){
    var product = res.locals().product;
    res.json(product);
};

app.get( '/product', getOne, transformProduct, sendProduct );

If you write middleware for your routes like this you'll end up with small building blocks you can easily reuse throughout your application.

于 2012-05-28T21:01:31.817 回答