JavaScript承诺猫鼬和蓝知更鸟会错过捕捉机会并失败

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

我已经开始使用promises,我使用Node.js芒果(与猫鼬一起)和蓝鸟。。 我遇到的问题是,出于某种原因,当我用返回承诺的函数链接mongoose调用时(我假设这是返回和链接的正确方法),我得到:

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;