Bluebird的Promise.map()在插入mongoose.Promise时无法使用Mongoose

时间:2017-05-24 22:45:06

标签: mongoose bluebird

我目前正在使用Mongoose和Bluebird作为插入的Promise库。 在mongoose docs之后,我做了以下几点:

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

// Some function making use of Bluebird's Promise.map()
function someFn() {
    return Promise.map([
        someModel.findById(someId).exec(),
        someOtherModel.findById(someOtherId).exec()
    ], mapperFn)
        .then(function() {})
        .catch(function() {});
}

正如您所看到的,我正在尝试在代码中使用bluebird的Promise.map(),但我一直收到以下错误:

TypeError: Promise.map is not a function

然后我尝试通过要求bluebird并将其设置为新的var Promise,就像这样

var mongoose = require('mongoose');
var Promise = require('bluebird');

// Some function making use of Bluebird's Promise.map()
function someFn() {
    return Promise.map([
        someMode.findById(someId).exec(),
        someOtherModel.findById(someOtherId).exec()
    ], mapperFn)
        .then(function() {})
        .catch(function() {});
}

这有效,但似乎不是解决此问题的正确方法。我不知道这是否会导致与猫鼬代码中的其他变量发生冲突。

有任何建议使这项工作?

2 个答案:

答案 0 :(得分:1)

要使用Promise.map(),您需要将Promise定义为Bluebird的对象,而不仅仅是常规的ES6 Promise。你会这样做:

let Promise = require('bluebird');
mongoose.Promise = Promise;

或者,你甚至可以这样做:

let Promise = mongoose.Promise = require('bluebird');

实际上,您尝试使用Promise.map()的常规ES6版本Promise

你的第二种方法是将Promise正确定义为Bluebird的库,这就是Promise.map()工作的原因,但你没有使用Bluebird的mongoose承诺,因为承诺不同类型之间的互操作性只要你只使用.then()来承诺从猫鼬回来的承诺,并且没有什么特别的,就像无数的Bluebird其他方法一样。承诺。

答案 1 :(得分:0)

您获得的错误是由定义mongoose.Promise而非Promise,然后使用Promise引起的,该变量在该范围内不存在。

第二种方法似乎并未修改mongoose内的任何内容。然而,只是为了确定如何定义promiseArray会很有趣。

然后,我不建议将undefined作为thencatch的处理程序传递。