Javascript Mongoose-Query exec()永远不会在模型方法中解析
为了重构一些将在不同地方使用的代码,我将这个方法从一个控制器转移到一个Mongoose模型 在模型中,trackQuery.exec从未到达回调,也从未解析。如果我在没有执行官或没有等待执行官的情况下解决问题,它可以正常工作。trackQuery正确地填充了Mongoose查询 猫鼬模型的精妙之处是什么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
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