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

Dan*_*ham 9 mongoose mongodb node.js promise

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

当我在'then'之后链接'catch'时我得到undefined不是一个函数,如果我只是将错误函数作为'then'的第二个参数调用,那么我没有.

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

为什么我不能在调用Model.create时链接'catch'

var mySchema = Mongoose.Schema({
     name: String,
});
Run Code Online (Sandbox Code Playgroud)

作品:

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

不起作用:

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

jbd*_*nte 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");
Run Code Online (Sandbox Code Playgroud)


ste*_*red 9

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


Che*_*hev 8

重复之后,看起来它.catch实际上并不是Promises/A +规范的一部分.大多数图书馆似乎只是将它作为语法糖来实现.该MPromise库是猫鼬的承诺库,它看起来像它遵循该规范的最低限度要求.您可以尝试使用另一个promise库来包装Mongoose承诺,但是它可能更容易吸收它并坚持使用标准.then(success, error)处理程序.

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

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

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