我有以下代码,其中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 [...]


似乎findOne方法未使用Q.nfcall正确调用,我正在使用Q's API Reference for nfcall function,但我无法理解原因。

最佳答案

猫鼬已经被许诺了。因此,您的代码可以简单地是:

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

09-27 16:44