async.map无法正常工作 [英] async.map not working as expected
问题描述
我正在尝试遍历一个集合,并附加一个来自相关集合的对象数组.我得到的结果不包含该数组. 谁能帮我发现问题?
I am trying to loop though a collection and append an array of objects from a related collection. The result I am getting does not contain that array. Can anyone help me spot the issue?
模型关系是Page有很多问题.
The model relationship is Page has many questions.
问题模式:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var questionSchema = new Schema({
_poll : { type: Schema.Types.ObjectId, ref: 'Poll' },
_page : { type: Schema.Types.ObjectId, ref: 'Page' },
type : { type : String, required: true },
title : { type : String, required: true },
required : { type : Boolean },
help_text : { type : String },
},
{ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
});
mongoose.model('Question', questionSchema);
页面架构:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var pageSchema = new Schema({
_poll : { type: Schema.Types.ObjectId, ref: 'Poll' },
title : { type : String, required: true },
intro : { type : String },
list_style_type : { type : String },
},
{ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
});
mongoose.model('Page', pageSchema);
路线
index:function(req,res,next){
index: function(req, res, next){
Poll.findOne({_id: req.params.poll_id}, function(err, poll){
if(err) return next(err);
Page.find({_poll: poll.id}, function(err, pages){
if(err) return next(err);
async.map(pages, function(p, done) {
Question.find({_page: p._id}, function(err, q){
if(err) return next(err);
p.questions = q; // <-- SHOULDN'T THIS WORK? //
done(null, pages);
});
}, function(err, result) {
if(err) return next(err);
res.status(200).json(pages);
})
});
});
},
我得到的结果:
[
{
_id: "57d960fb569dc4101a83525e",
updated_at: "2016-09-14T14:38:51.113Z",
created_at: "2016-09-14T14:38:51.113Z",
_poll: "57c88775992af4c84f99c5d0",
title: "test section",
list_style_type: "lower-roman",
__v: 0
},
{
_id: "57d9691e22eb81583e20a1c1",
updated_at: "2016-09-14T15:13:34.244Z",
created_at: "2016-09-14T15:13:34.244Z",
_poll: "57c88775992af4c84f99c5d0",
title: "this is a new page",
list_style_type: "lower-roman",
intro: "jkc hcsad",
__v: 0
},
{
_id: "57d9a97d1e7863b81f9e4d0e",
updated_at: "2016-09-14T19:48:13.816Z",
created_at: "2016-09-14T19:48:13.816Z",
_poll: "57c88775992af4c84f99c5d0",
title: "Consequatur Vero necessitatibus consequatur hic",
list_style_type: "upper-latin",
intro: "Rem laboris est omnis ducimus, minim autem itaque minim dolore ea odio aliqua. Autem qui id, sit nulla id.",
__v: 0
},
{
_id: "57dab7d7f54387d41d976614",
updated_at: "2016-09-15T15:01:44.001Z",
created_at: "2016-09-15T15:01:44.001Z",
_poll: "57c88775992af4c84f99c5d0",
title: "This is a new page",
list_style_type: "lower-roman",
intro: "cjksahc dsa",
__v: 0
}
]
我希望返回的对象包含一个数组"questions",但不知何故不存在.
I expected the returned objects to contain an the array "questions" but somehow it is not there.
先谢谢您!
推荐答案
也许在您的路由"代码中,错误的变量传递给了回调.
我认为done(null, pages)
应该是done(null, p)
,而res.status(200).json(pages)
应该是res.status(200).json(result)
.
Maybe in your "Route" code, wrong variables passed to the callback.
I think done(null, pages)
should be done(null, p)
and res.status(200).json(pages)
should be res.status(200).json(result)
.
并且由于猫鼬会忽略架构中不存在的字段,因此questions
不会出现在您的结果中.
在您的路由"代码中,p
是猫鼬文档,您可以通过.toObject()
将其转换为纯JavaScript对象.
And because mongoose ignores fields that does not exist in the schema, questions
would not appear in your result.
In your "Route" code, p
is a mongoose document and you can convert it into a plain javascript object by .toObject()
.
因此也许您可以通过替换以下代码来获得questions
的结果:
So maybe you can get results with questions
by replacing your code like:
async.map(pages, function(p, done) {
Question.find({_page: p._id}, function(err, q){
if(err) return next(err);
p = p.toObject(); // convert a mongoose document into a javascript object
p.questions = q;
done(null, p); // modified 'pages' -> 'p'
});
}, function(err, result) {
if(err) return next(err);
res.status(200).json(result); // modified 'pages' -> 'result'
})
这篇关于async.map无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!