我有一个api服务器和一些脚本作业。他们使用相同的功能使用猫鼬拉出名册,并在名册中填充球员。 在api服务器上,通常会调用此函数。使用脚本,不会。
API示例
function getRoster(id) {
var deferred = Q.defer();
Roster.find({_id:id}, 'playerRoster userId tournamentId').populate('playerRoster').exec(
function(err, roster) {
if (err) {
deferred.resolve(err);
}
deferred.resolve(roster[0]);
});
return deferred.promise;
}
api.post('/get_roster', function(req, res) {
// get tournament
var id = req.body._id;
var playerId = req.body.playerId;
getRoster(id).then(function(data) {
var roster=data;
res.json(roster);
});
});
脚本
module.exports = function(config) {
this.getRoster=function(id) {
//return Roster.find({_id:id}, 'playerRoster userId tournamentId').exec( - THIS RETURNS
return Roster.find({_id:id}, 'playerRoster userId tournamentId').populate('playerRoster').exec(
function(err, roster) {
if (err) {
return err;
}
console.log('roster[0]',roster);
return roster[0];
});
}
this.tallyPoints = function(tournamentPlayer,sportsPlayers) {
var deferred = Q.defer();
var totalPoints =0;
console.log("tallyPoints 0 ",tournamentPlayer);
var rosterId = tournamentPlayer.player.roster[0];
console.log("tallyPoints 1 ",rosterId);
this.getRoster(rosterId).then(function(roster2){
console.log("tallyPoints 2 ",roster2);
...
deferred.resolve(totalPoints);
});
return deferred.promise;
}
return this;
};
在脚本中,既不会记录名册[0]也不会打印tallyPoints 2行,但是也没有错误。
为什么添加填充时Roster.find不返回?我唯一能想象的是,因为playerRoster集合有2000条记录,搜索约10条记录,但遇到了一些未被捕获的超时问题。
任何建议清理它也很感激。 谢谢
答案 0 :(得分:0)
Moongoose在很长一段时间内都支持诺言。在需要诺言且将model_v.evaluate(X, y)
与现有诺言一起使用被称为Deferred反模式时,不适合使用基于回调的Mongoose API(类似地,Q.defer
会产生诺言构造反模式)。
在当前状态下,new Promise
不会返回承诺并且不能正确处理错误。
getRoster
考虑到仅使用function getRoster(id) {
return Roster.find({_id:id}, 'playerRoster userId tournamentId').populate('playerRoster').exec()
.then(roster => roster[0]);
}
api.post('/get_roster', function(req, res) {
// get tournament
var id = req.body._id;
var playerId = req.body.playerId;
getRoster(id)
.then(function(data) {
var roster=data;
res.json(roster);
})
.catch(err => {
// handle error
});
});
,可能应将其更改为roster[0]
。
无论Roster.findOne
是用于Express路线还是其他地方,它都可以工作。未知如何使用getRoster
模块,但是module.exports = function(config) {...}
如果未用作类可能会引用错误的上下文。如果this
和getRoster
不使用tallyPoints
,则它们不应驻留在此函数中。