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 と組み合わせるにはどうすればよいでしょうか。

EDIT1

私はこの戦略を使用しましたが、正しいかどうかわかりません。何か提案はありますか?

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 でルートと呼んでいるものについては、実際には非同期ライブラリを使用する必要はほとんどありません。その理由は、ルートは実際には一種の制御フローそのものだからです。必要な数のミドルウェアを使用するため、ルートを小さなコード ブロックに分割できます。

たとえば、データベースから 1 つのレコード/ドキュメントを取得して何かを実行し、それを 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 );

このようにルート用のミドルウェアを作成すると、アプリケーション全体で簡単に再利用できる小さなビルディング ブロックが作成されます。

于 2012-05-28T21:01:31.817 に答える