Promise问题:使用Q.nfcall()调用mongoose.findOne()

我有下面的代码,其中mongoosefindOne方法使用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; }); }