async.map无法正常工作 [英] async.map not working as expected

查看:133
本文介绍了async.map无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试遍历一个集合,并附加一个来自相关集合的对象数组.我得到的结果不包含该数组. 谁能帮我发现问题?

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆