Javascript Mongoose-Query exec()永远不会在模型方法中解析

Javascript Mongoose-Query exec()永远不会在模型方法中解析,javascript,node.js,mongoose,promise,mongoose-schema,Javascript,Node.js,Mongoose,Promise,Mongoose Schema,为了重构一些将在不同地方使用的代码,我将这个方法从一个控制器转移到一个Mongoose模型 在模型中,trackQuery.exec从未到达回调,也从未解析。如果我在没有执行官或没有等待执行官的情况下解决问题,它可以正常工作。trackQuery正确地填充了Mongoose查询 猫鼬模型的精妙之处是什么 ArtistSchema.methods.insertRelatedTracks = function (items) { const newTracksToSave = items.m

为了重构一些将在不同地方使用的代码,我将这个方法从一个控制器转移到一个Mongoose模型

在模型中,trackQuery.exec从未到达回调,也从未解析。如果我在没有执行官或没有等待执行官的情况下解决问题,它可以正常工作。trackQuery正确地填充了Mongoose查询

猫鼬模型的精妙之处是什么

ArtistSchema.methods.insertRelatedTracks = function (items) {
    const newTracksToSave = items.map((item) => {
        return new Promise((resolve, reject) => {
            const TrackModel = mongoose.model('Track'),
                trackQuery = TrackModel.findOne({ externalID: item.id })
            ;

            return trackQuery.exec((err, track) => {
                if (err) { 
                    return reject(err);
                }

                if (!track) {
                    let track = new TrackModel({
                        externalID: item.id,
                        provider: item.provider,
                        title: item.title,
                        artist: item.artist,
                        artistID: this._id,
                        artistExternalID: this.externalID,
                        thumbnail: item.thumbnail,
                        publishedAt: item.publishedAt,
                        count: 0
                    });

                    return track.save((err, res) => {
                        if (err) {
                            return reject(err);
                        }

                        return resolve(res);
                    });
                }

                return resolve(track);
            });
        });
    });

    return Promise.all(newTracksToSave).then(() => {
        return this;
    }).catch((err) => {
        console.error(err);
        return this;
    });
}

我的解决方案是手动导入TrackModel,而不是依赖于通常的运行时mongoose.model'Track'方法。我没有解释为什么mongoose.model在这种情况下不起作用。欢迎任何提示

这可能与您的问题无关,但是.exec已经返回了一个承诺,所以不需要用额外的新承诺来包装Mongoose查询。。。。当前代码可能存在的一个问题是,如果某个轨迹不存在,您仍然需要解析一个空/未定义的轨迹变量,并且它将在调用Resolves之前解析。所以代码应该是if!track{…}else{return resolvetrack}@robertklep谢谢你的评论!:这肯定没有关系,因为代码中唯一的区别是导入TrackModel的方式。另一方面,我的印象是,承诺或不回报都会在同一范围内停止执行。返回轨道。保存。。。会阻止任何人进入返回轨道;如果没有轨道。我错了吗?对不起,我的错,我错过了赛道前面的回程。请忽略我评论的这一部分;D