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

我有一个mongoose模式,并调用Model.create()。

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

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

为什么在调用Model.create时不能链接“catch”?

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

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

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

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

蓝鸟是我最喜欢的实现,但几乎任何stream行的诺言库都有这个能力。

http://mongoosejs.com/docs/promises.html中所述

Mongoose 4.1.0中的新function虽然对于基本用例来说,mpromise已经足够,但是高级用户可能希望插入像蓝鸟这样的最喜欢的ES6风格的promise类库,或者只是使用原生ES6承诺。 只要设置mongoose.Promise到你最喜欢的ES6风格的承诺构造和mongoose将使用它。

你可以设置mongoose使用蓝鸟使用:

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

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