Promise问题:使用Q.nfcall()调用mongoose.findOne()
我有下面的代码,其中mongoose
的findOne
方法使用Q.promise
包装:
// _getById should be returning a Promise var _getById = function(id) { return Q.Promise(function(resolve, reject) { ApplicationModel.findOne({ _id: id, 'metadata.isDisabled': false }, '-metadata', function(err, application) { if (err) { return reject(err); } if (!application) { return reject(new CustomError('Not found', 404)); } resolve(application); }); }); }
我正在尝试使用Q.nfcall
方法重构该代码,这是我到目前为止:
var _getById = function(id) { var searchOptions = { _id: id, 'metadata.isDisabled': false }; return Q.nfcall(ApplicationModel.findOne, searchOptions, '-metadata') .then(function(application) { if (!application) { throw new CustomError('Not found', 404); } return application; }); }
但它不工作 ,我在屏幕上得到以下错误 :
info:TypeError:无法在findOne […]中读取未定义的属性'discriminatorMapping'
看来, findOne
方法没有正确使用Q.nfcall
,我正在按照Q的API参考nfcall函数,但我不明白为什么。
mongoose已经promisified。 所以,你的代码可以简单地为:
var _getById = function(id) { var searchOptions = { _id: id, 'metadata.isDisabled': false }; return ApplicationModel.findOne(searchOptions, '-metadata') .then(function(application) { if (!application) { throw new CustomError('Not found', 404); } return application; }); }