Mongoose - 查询 exec() 永远不会在模型方法中解析
Posted
技术标签:
【中文标题】Mongoose - 查询 exec() 永远不会在模型方法中解析【英文标题】:Mongoose - Query exec() never resolves in model method 【发布时间】:2017-09-06 13:34:40 【问题描述】:为了尝试重构一些将在不同地方使用的代码,我将这个已经在控制器中工作的方法移到了 Mongoose 模型中。
在模型中,trackQuery.exec()
永远不会到达回调,永远不会解析。如果我在没有exec()
或不等待exec()
的情况下解决问题,它可以正常工作。 trackQuery
用 Mongoose Query
正确填充。
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;
);
【问题讨论】:
【参考方案1】:我的解决方案是手动导入TrackModel
,而不是依赖通常的运行时mongoose.model('Track')
方法。我没有解释为什么mongoose.model
在这种情况下不起作用。欢迎任何提示。
【讨论】:
这可能与您的问题无关,但.exec()
已经返回了一个承诺,因此不需要用额外的new Promise(...)
包装Mongoose 查询。您当前代码的一个可能问题是,如果轨道不存在,您仍然会解决空/未定义 track
变量的承诺,并且它将解决 before 对 resolve(res)
的调用.所以代码应该是if (! track) ... else return resolve(track)
@robertklep 感谢您的评论! :) 这绝对不相关,因为代码中唯一的区别是导入TrackModel
的方式。另一方面,我的印象是,无论是否 Promises,return
都会停止相同范围内的执行。如果没有轨道,return track.save...
将阻止到达return resolve(track);
。我错了吗?
对不起,我的错,我错过了track.save()
前面的return
。请忽略我评论的那部分;D以上是关于Mongoose - 查询 exec() 永远不会在模型方法中解析的主要内容,如果未能解决你的问题,请参考以下文章