猫鼬的承诺不在脚本中填充

时间:2018-09-07 23:28:14

标签: node.js mongoose

我有一个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条记录,但遇到了一些未被捕获的超时问题。

任何建议清理它也很感激。 谢谢

1 个答案:

答案 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) {...}如果未用作类可能会引用错误的上下文。如果thisgetRoster不使用tallyPoints,则它们不应驻留在此函数中。