JavaScript承诺mongoose和蓝鸟缺less捕获和失败

我已经开始使用承诺,我使用Node.js芒果(与mongoose)和蓝鸟..我遇到的问题是由于某种原因,当我链接mongoose调用function返回承诺(我假设这是正确的方式返回和链)然后我得到:

typeError: Object #<Promise> has no method 'fail' 

如果我改变了失败,那么我得到同样的问题:

 typeError: Object #<Promise> has no method 'catch' 

我所做的是使用function(空,function)模式,这是完全失败和赶上。 然而,catch / fail更具可读性。 任何线索为什么我得到这个,我该如何解决这个问题?

这是一个代码块的例子。

 User.findOne({ 'email' : user_email }).exec() }).then (promisedTransformUserSchemaToFrontendObjectWithProjectMapping) .then (function (feUser) { return new Promise(function (resolve, reject) { res.json(feUser); return resolve(feUser); }); }).fail/catch (function (err) { console.log(err); sendError(res,"failed to get user",err); }); 

这里是堆栈跟踪:

 TypeError: Object #<Promise> has no method 'catch' at module.exports.app.put.User.update.email (app\controllers\router.js:165:16) at callbacks (node_modules\express\lib\router\index.js:164:37) at isLoggedIn (app\controllers\router.js:741:10) at callbacks (node_modules\express\lib\router\index.js:164:37) at param (node_modules\express\lib\router\index.js:138:11) at param (node_modules\express\lib\router\index.js:135:11) at pass (node_modules\express\lib\router\index.js:145:5) at Router._dispatch (node_modules\express\lib\router\index.js:173:5) at Object.router (node_modules\express\lib\router\index.js:33:10) at next (node_modules\express\node_modules\connect\lib\proto.js:193:15) 

mongoose4.1+维护者build议:

es2015(es6):

 require('mongoose').Promise = Promise; 

蓝鸟:

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

问:

 require('mongoose').Promise = require('q').Promise; 

我不知道moongose,但总的来说,失败或捕获的function是便捷的捷径,并不是承诺规范的一部分。 因此,图书馆不需要让他们遵守承诺。 显然在你的情况下,他们不在那里。

您可以使用then(successHandler, rejectionHandler)实现相同的function。

为了处理承诺拒绝,您可以按如下方式重写您的代码:

 User.findOne({ 'email' : user_email }).exec() }).then (promisedTransformUserSchemaToFrontendObjectWithProjectMapping) .then (function (feUser) { return new Promise(function (resolve, reject) { res.json(feUser); return resolve(feUser); }); }).then (undefined, function (err) { console.log(err); sendError(res,"failed to get user",err); }); 

蓝鸟文档展示了另一种方式:

https://github.com/petkaantonov/bluebird/blob/master/API.md#promiseresolvedynamic-value—promise

你可以在蓝鸟的Promise.resolve()中包装mongoose的承诺,你会得到一个蓝鸟的承诺。

  Promise.resolve(User.findOne({ 'email' : user_email }).exec()) .then (promisedTransformUserSchemaToFrontendObjectWithProjectMapping) .then (function (feUser) { res.json(feUser); return feUser; }).fail/catch (function (err) { console.log(err); sendError(res,"failed to get user",err); }); 

似乎问题是混合了两种types的诺言(蓝鸟和mongoose)。

一旦我在数据库对象上使用了promsifyAll,catch就开始工作了。

 // promisify all model using mongoomise.. require('../../mongoomise').promisifyAll(mongoose, require('bluebird'))