1

MongoDB用にnode.js、express、MongoSkinドライバーを使用しています。

ブログ投稿のリストを表示するビューをブログアプリケーションでレンダリングしようとしています。各投稿には、作成者IDへの参照があります。各参照の完全な著者ドキュメントを取得するために、各投稿に対して2番目のクエリを作成しようとしています。すべてが非同期であると、私はかなり混乱します。

ブログ投稿のリストを取得するためのコールバックで、各投稿をループし、関連するユーザーを取得するために2回目の呼び出しを行います。すべての投稿に作成者ドキュメントが追加された後でのみビューをレンダリングする方法がわかりません。私はこの権利のいずれかを行っているかどうかさえわかりません。他のドキュメントを参照して、やりたいことを達成するにはどうすればよいですか?

// getPageOfPosts is a custom helper that accepts the page number and number of items to retrieve.
db.collection('blogPosts').getPageOfPosts(req.param('page') || 1, 3, function (err, blogPosts) {
    if (err) req.next(err);
    blogPosts.forEach(function (blogPost) {
        db.collection('users').findOne({ _id: blogPost.authorId }, function (err, user) {
            if (err) req.next(err);
            blogPost.author = user;
        });
    });
    var viewModel = {
        posts: blogPosts
    };
    res.render('blog/index', viewModel);
});
4

1 に答える 1

2

nodejshttps://github.com/caolan/asyncで非同期ライブラリを使用できます。これは、関数のグループを直列または並列で実行するのに役立ち、それらがすべて完了すると、レンダリング部分を実行できる最終的なコールバックが呼び出されます。


質問の作成者による編集:

これは素晴らしい提案であり、美しく機能しました!方法は次のとおりです。

db.collection('blogPosts').getPage(req.param('page') || 1, 3, function (err, blogPosts) {
    if (err) req.next(err);
    var addUsersArray = [];
    blogPosts.forEach(function (blogPost) {
        addUsersArray.push(function (callback) {
            db.collection('users').findOne({ _id: blogPost.author }, function (err, user) {
                if (err) callback(err);
                blogPost.author = user;
                callback(null, blogPost);
            });
        });
    });
    async.parallel(addUsersArray, function (err, blogPosts) {
        if (err) req.next(err);
        var viewModel = {
            posts: blogPosts
        };
        res.renderView('blog/index', viewModel);
    });
});

以下もうまく機能します

db.collection('blogPosts').getPageOfPosts(req.param('page') || 1, 3, function (err, blogPosts) {
if (err) req.next(err);
async.each(blogPosts,function (blogPost,cb) {
    db.collection('users').findOne({ _id: blogPost.authorId }, function (err, user) {
        if (err) req.next(err);
        blogPost.author = user;
        cb(err);
    });
},function(error)
{
    var viewModel = {
    posts: blogPosts
    };
    res.render('blog/index', viewModel);
});

});

于 2013-03-04T04:31:42.560 に答える