2013-04-20 68 views
3

我是nodejs/mongo/mongoose的新手,我正在尝试做一件非常简单的事情。我有以下模式:在猫鼬/ mongodb/node中使用异步回调循环

var authorSchema = mongoose.Schema({ 
    name: String,   
}); 
Author = mongoose.model('Author', authorSchema); 

var bookSchema = mongoose.Schema({ 
    title: String,   
    isbn: String, 
    pages: Number,   
    author: { type : mongoose.Schema.ObjectId, ref : 'Author', index: true } 
}); 
Book = mongoose.model('Book', bookSchema); 

我想为每个作者创建一个id,名称和书数的作者列表。我有这样的事情:

exports.author_list = function(req, res){ 
    Author.find({}, function (err, authors){ 
     var author_array = Array(); 
     for (var i=0;i<authors.length;i++){ 
      var author_obj = new Object(); 
      author_obj.id = authors[i]._id; 
      author_obj.name = authors[i].name; 
      author_obj.count = 0; //here is the problem 
      author_array[i] = author_obj; 
     } 
     res.writeHead(200, { 'Content-Type': 'application/json' }); 
     res.write(JSON.stringify({ authors: author_array })); 
     res.end(); 

    }); 
} 

我知道如何做一个计数查询。我的问题是如何做一个循环的作者和异步回调填充输出。什么是适当的方式来实现这个在nodejs时尚?

感谢

+0

什么是'Request'(似乎是一个模式,但你还没有表现出它)?什么是“请求”(for循环中使用)?你想用'author_obj.count'来计算什么? “循环作者并用异步回调填充输出”意味着什么? – 2013-04-20 13:12:04

+0

对不起,请求是我原来的代码剩下的。我将我的代码更改为作者/书籍模型,以获得更清晰的示例。 – gtsouk 2013-04-20 13:30:58

回答

5

我想你想使用类似async协调这些请求; map()似乎是一个不错的选择:

Author.find({}, function (err, authors) { 
    async.map(authors, function(author, done) { 
    Book.count({author: author._id}, function(err, count) { 
     if (err) 
     done(err); 
     else 
     { 
     done(null, { 
      id : author._id, 
      name : author.name, 
      count : count 
     }); 
     }   
    }); 
    }, function(err, author_array) { 
    if (err) 
    { 
     // handle error 
    } 
    else 
    { 
     /* 
     res.writeHead(200, { 'Content-Type': 'application/json' }); 
     res.write(JSON.stringify({ authors: author_array })); 
     res.end(); 
     */ 
     // Shorter: 
     res.json(author_array); 
    } 
    }); 
});