为什么在调用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()
正常工作。