JavaScript承诺猫鼬和蓝知更鸟会错过捕捉机会并失败
我已经开始使用promises,我使用Node.js芒果(与猫鼬一起)和蓝鸟。。 我遇到的问题是,出于某种原因,当我用返回承诺的函数链接mongoose调用时(我假设这是返回和链接的正确方法),我得到:JavaScript承诺猫鼬和蓝知更鸟会错过捕捉机会并失败,javascript,node.js,mongodb,mongoose,promise,Javascript,Node.js,Mongodb,Mongoose,Promise,我已经开始使用promises,我使用Node.js芒果(与猫鼬一起)和蓝鸟。。 我遇到的问题是,出于某种原因,当我用返回承诺的函数链接mongoose调用时(我假设这是返回和链接的正确方法),我得到: typeError: Object #<Promise> has no method 'fail' 这是stacktrace: TypeError: Object #<Promise> has no method 'catch' at module.export
typeError: Object #<Promise> has no method 'fail'
这是stacktrace:
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)
TypeError:对象#没有方法“catch”
位于module.exports.app.put.User.update.email(app\controllers\router.js:165:16)
在回调时(node_modules\express\lib\router\index.js:164:37)
在isLoggedIn(app\controllers\router.js:741:10)
在回调时(node_modules\express\lib\router\index.js:164:37)
at参数(node_modules\express\lib\router\index.js:138:11)
at参数(node_modules\express\lib\router\index.js:135:11)
通过时(node_modules\express\lib\router\index.js:145:5)
路由器调度(节点\u modules\express\lib\Router\index.js:173:5)
在Object.router(node_modules\express\lib\router\index.js:33:10)
下一步(node\u modules\express\node\u modules\connect\lib\proto.js:193:15)
我不知道moongose,但一般来说,fail或catch等函数都是方便快捷方式,不属于Promissions规范的一部分。因此,库不需要让它们符合Promissions。显然在你的情况下,他们不在那里
您可以使用然后(successHandler,rejectionHandler)
实现相同的功能
为了处理拒绝承诺,您可以按如下方式重写代码:
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);
});
问题似乎是混合了两种承诺(蓝鸟和猫鼬) 一旦我在db对象上使用了Promisfyall,捕获就开始起作用了
//使用mongoomise发布所有模型。。
require('..../mongoomise')。promisifyAll(mongoose,require('bluebird'))
另一种方法如bluebird文档所示:
您可以将猫鼬的承诺封装在蓝鸟的承诺中。resolve(),然后您将得到蓝鸟的承诺
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);
});
mongoose 4.1+维护者建议:
es2015(es6):
蓝鸟:
require('mongoose').Promise = require('bluebird');
问:
您可以共享堆栈跟踪吗?不要使用mongoose返回的承诺,只需promisifyAll并独家使用
*Async
方法,因此新承诺
位会受到延迟的反攻击-pattern@Esailija是的,可以是.tap(res.json)
@Esailija为什么不使用异步方法,为什么新的承诺是一种反模式?@MuhammadUmer尝试一下我添加的这段代码,我希望它能有所帮助。如果你使用mongoose 4.1.0(2015-07-24发布)或更高版本,那么你不应该对mongoose使用promisify
。Jason Sebring的答案应该是首选的(我的意见是标记的解决方案应该更改)。我认为catch很好,至少MDN在文档中有它和Promise。全部拒绝并解决。为什么只有+3?使用require('mongoose')。Promise=Promise;轻松添加支持,让我的世界变得更美好。谢谢!!
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);
});
require('mongoose').Promise = Promise;
require('mongoose').Promise = require('bluebird');
require('mongoose').Promise = require('q').Promise;