我有一个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
});
答案 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库都有这种能力。