为什么我不能在节点中调用mongoose Model.create时链接.catch

时间:2015-06-05 17:16:06

标签: node.js mongodb mongoose promise

我有一个mongoose架构,我正在调用Model.create()。

当我链接'赶上'之后'然后'我得到undefined不是一个函数,如果我只是将错误函数作为第二个参数调用到'那么'然后我就不会。

但是当我调用Model.find之类的方法时,我可以使用' catch'。

为什么我不能连接'赶上'在调用Model.create

var mySchema = Mongoose.Schema({
     name: String,
});

使用:

KarmaModel.create({
            "name": "ss,
        })
        .then(function() {
            //do somthing
        },function()=>{
            //do somthing
        });

不起作用:

KarmaModel.create({
            "name": "ss,
        })
        .then(function() {
            //do somthing
        }).catch(function()=>{
            //do somthing
        });

3 个答案:

答案 0 :(得分:11)

http://mongoosejs.com/docs/promises.html

上指定
  

Mongoose 4.1.0中的新功能   虽然mpromise足以满足基本用例,但高级用户可能希望插入他们喜欢的ES6风格的承诺库,如bluebird,或者只使用本机ES6承诺。只需将mongoose.Promise设置为您最喜欢的ES6风格的promise构造函数,mongoose就会使用它。

你可以设置mongoose使用bluebird:

require("mongoose").Promise = require("bluebird");

答案 1 :(得分:9)

在某些时候, mpromise 似乎增加了对.catch()的支持。我正在使用 mongoose@4.5.1 .catch()正常工作。

答案 2 :(得分:8)

完成后,看起来.catch实际上并不是Promises/A+规范的一部分。大多数图书馆似乎只是将它作为语法糖来实现。 MPromise library是Mongoose的promise库,看起来它符合规范的最低要求。您可以尝试使用另一个promise库来包装Mongoose promises,但是它可能更容易吸收它并坚持使用标准的.then(success, error)处理程序。

如果你想包装它们,你可以这样做:

var Promise = require('bluebird');
Promise.resolve(KarmaModel.create({ "name": "ss" })
  .then(function() {
    // do something
  })
  .catch(function() {
    // do something
  });

Bluebird是我最喜欢的实现,但几乎任何流行的promise库都有这种能力。