嵌套猫鼬用承诺填充



我正在尝试填充我的模型,看起来像:

var Org = new mongoose.Schema({
        _id: {type: String, unique:true}, //this will be the org code
        name: String,
        level: String,
        children: [{type: String, ref: 'Org'}]
    });
//Orgs have children orgs, which themselves can have children orgs at N levels

给定一个Org,我想填充它的子节点,再填充它的子节点,以此类推。我可以这样完成N = 2个关卡:

     req.Model.findOne({_id: id}).populate('children').exec(function(err, doc){
        if (err){
            return next(err);
        }
        req.Model.populate(doc, {path: 'children.children'}, function(err, doc){
            if(err){
                return next(err);
            }
            return res.json(doc);
        });
    });

几个小时以来,我一直在尝试使用承诺来完成上述任务,即使在N=2时也是如此。我认为对于N = *的级别,用承诺来做会更干净,猫鼬有一个内置的实现。

        req.Model.findOne({_id: id}).populate('children').exec()
        .then(function (doc){
            if(!treeView) {
                return doc;
            }
            return req.Model.populate(doc, {path: 'children.children'});
        })
        .then(function (doc){
            return res.json(doc);
        },function(err){
            return next(err);
        });
// treeView is a query string that lets me know that I need to populate the refs

我认为它应该是这样工作的:

  1. exec()返回一个promise,我在第一次调用then()时开始处理它
  2. 如果treeView为false,我返回doc,这被视为原始承诺的解析,因此第二个then()处理程序被调用。这种情况确实会发生。
  3. 如果treeView是true,调用Model。populate返回另一个promise,它也将在第二次调用then()时处理。

{
   "status": "error",
   "serverTimestamp": "2014-07-24T18:23:02.974Z",
   "message": ""function" == "undefined""
}

我知道它到达了第二个then()的错误处理程序,因为我已经注销到控制台进行验证,但我不知道为什么会发生这种情况。一旦我可以让它工作,我将尝试使它为N=*级别工作,我想这将涉及递归地创建更多的承诺。我在这里看到了许多相关的问题,但不是我所需要的。

非常感谢任何帮助。

我能够在MongooseJS v4.1中使用从Mongoose模型返回的Mongoose承诺使嵌套子文档填充工作。无需使用其他承诺库。

var fuelOrderId = req.params.fuelOrderId;
fuelOrderModel.findById(fuelOrderId).populate('aircraftId')
.then(function(order){
    return fuelOrderModel.populate(order,
         {path: 'aircraftId.aircraftContacts', 
          model: 'aircraftContactModel'});
})
.then(function(result){
    res.json({
        fuelOrder: result,
        status: 1
    });
},function(err){
    console.error(err);
    res.json({err: err, status: 0});
})

Edit考虑使用.catch()而不是第二个错误函数。mpromise现在支持.catch()

似乎找到了一个解决方案。

Q.ninvoke(doc, 'populate',{path: children.children})
.then(function(doc){
    return res.json(doc);
},function(err) {
    return next(err);
});

对我来说奇怪的是我需要使用猫鼬文档。而不是Model.populate(doc..),根据文档,它的行为应该非常相似,除非返回一个promise。这是我必须使用Q promise api的一个原因,因为Document。populate不会像Model那样返回一个promise。填充。我找不到莫德尔。填充工作没有一个常规的节点样式回调,但这个解决方案做了我需要的。至于N=*层,我只是递归地调用Q.ninvoke,只要我需要,扩展路径,我可以填充多少层深度,我想要。

相关内容

  • 没有找到相关文章

最新更新