Express 猫鼬';s的填充方法打破了承诺链?

Express 猫鼬';s的填充方法打破了承诺链?,express,mongoose,mongoose-populate,Express,Mongoose,Mongoose Populate,我有一个猫鼬模式,看起来像这样: var Functionary=新模式({ 人:{ 类型:mongoose.Schema.Types.ObjectId, 参考:“人” }, 派遣日期:日期, 放电日期:日期, isActive:布尔值 }); var PositionSchema=新架构({ 名称:String, 描述:字符串, maxHeadCount:人数, 员工总数:人数, 目前的员工人数:, 现任控股:[公职人员], 历史:[职务], 负责:{ 类型:mongoose.Schema.T

我有一个猫鼬模式,看起来像这样:

var Functionary=新模式({
人:{
类型:mongoose.Schema.Types.ObjectId,
参考:“人”
},
派遣日期:日期,
放电日期:日期,
isActive:布尔值
});
var PositionSchema=新架构({
名称:String,
描述:字符串,
maxHeadCount:人数,
员工总数:人数,
目前的员工人数:,
现任控股:[公职人员],
历史:[职务],
负责:{
类型:mongoose.Schema.Types.ObjectId,
参考:“位置”
}
});
*请注意,职位文档可以在
ResponsibleTo
字段中引用自身

现在,我正在尝试构建一个方法来搜索
Positions
集合,填充
currentlyHolding[].person.name字段
responsibleTo.currentlyHolding[].person.name
字段,并返回找到的记录总数(用于前端的分页)

我的代码是这样的:

exports.search=函数(req,res){
var结果={
记录:空,
计数:0,
当前页面:请求参数页面,
总页数:0,
页面大小:10,
执行时间:0
};
var startTime=新日期();
变量populateQuery=[
{
路径:“currentlyHolding.person”,
选择:“名称”
}, {
路径:'responsibleTo',
选择:'name currentlyHolding.person'
}
];
定位(
{
$or:[
{name:{$regex:'.'.'+req.params.keyword+'.'.',$options:'i'},
{description:{$regex:'.'.'+req.params.keyword+'.'.''.',$options:'i'}
]
},
{},
{
跳过:(result.currentPage-1)*result.pageSize,
限制:result.pageSize,
排序:“名称”
})
.exec()
.populate(populateQuery)
.然后(功能(文档){
result.records=doc;
});
位置.计数(
{
$or:[
{name:{$regex:'.'.'+req.params.keyword+'.'.',$options:'i'},
{description:{$regex:'.'.'+req.params.keyword+'.'.''.',$options:'i'}
]
})
.exec()
.然后(功能(文档){
result.count=doc;
result.totalPages=Math.ceil(result.count/result.pageSize);
})
.然后(函数(){
var endTime=新日期();
result.execTime=endTime-startTime;
返回res.json(200,result);
});
};

我的问题是,当我使用populate方法运行第一个查询时(如图所示),它不起作用。我去掉了填充,它就工作了。populate方法真的会违背承诺吗?如果是这样的话,有没有更好的方法来实现我的目标?

你问起这个问题已经有一段时间了,但这可能对其他人还是有帮助的,所以我们开始:

.populate()
不返回承诺。要实现这一点,您应该链接
.execPopulate()

或者,您可以将
.populate()
放在
.exec()
之前。后者将终止查询生成器界面并为您返回承诺