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

Posted

技术标签:

【中文标题】承诺问题:使用 Q.nfcall() 调用 mongoose.findOne()【英文标题】:Promise issue: using Q.nfcall() to call mongoose.findOne() 【发布时间】:2016-04-14 23:56:31 【问题描述】:

我有以下代码,其中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;
    );

但它不起作用,我在屏幕上收到以下错误

信息:TypeError:无法读取属性“discriminatorMapping”的 不明确的 在 findOne [...]

似乎没有使用Q.nfcall 正确调用findOne 方法,我正在关注Q's API Reference for nfcall function,但我不明白为什么。

【问题讨论】:

你知道mongoose 已经被承诺了吗? return ApplicationModel.findOne(ApplicationModel.findOne, searchOptions, '-metadata').then( ... ); @ShanShan 是吗?我有第一个通知! (如果我这样做了,我就不会承诺了^^) 是的,试试我写的代码,应该可以的。不过你有一个借口,猫鼬文档不是最容易阅读的:p @ShanShan haha​​ha 我同意,它们不是最简单的!谢谢!! :-) 我现在要试试。您可以将其发布为答案,我会将其标记为正确。 @ShanShan 完美运行!继续,回答问题! :-) 【参考方案1】:

猫鼬已经被承诺了。因此,您的代码可以是:

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;
    );

【讨论】:

这非常有用!!

以上是关于承诺问题:使用 Q.nfcall() 调用 mongoose.findOne()的主要内容,如果未能解决你的问题,请参考以下文章

通过 jQuery addClass 调用使用标准 JS 承诺

等待循环中调用的所有承诺完成

承诺链中的返回值没有被调用

节点递归承诺永远不会退出

NodeJ使用请求承诺来调用外部API,从响应主体中保存数据

尽管使用 done,Mocha 在 Before 钩子中调用异步承诺链超时