JavaScript承诺mongoose和bluebird缺少捕获和失败

Dor*_*don 8 javascript mongoose mongodb node.js promise

我已经开始使用promises,我使用Node.js Mango(带有mongoose)和bluebird ..我遇到的问题是由于某种原因,当我用返回promises的函数链接mongoose调用时(我假设这是正确的)返回和链的方式)然后我得到:

typeError: Object #<Promise> has no method 'fail'
Run Code Online (Sandbox Code Playgroud)

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

typeError: Object #<Promise> has no method 'catch'
Run Code Online (Sandbox Code Playgroud)

我所做的是使用函数(null,function)模式,它完全失败并捕获.然而,捕获/失败更具可读性.任何线索为什么我得到这个以及我应该如何解决这个问题?

这是代码块的示例.

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);
   });
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

Jas*_*ing 16

mongoose 4.1+维护者建议:

es2015(es6):

require('mongoose').Promise = Promise;
Run Code Online (Sandbox Code Playgroud)

蓝鸟:

require('mongoose').Promise = require('bluebird');
Run Code Online (Sandbox Code Playgroud)

问:

require('mongoose').Promise = require('q').Promise;
Run Code Online (Sandbox Code Playgroud)


smy*_*myk 5

我不知道moongose,但一般来说,失败或捕获等功能都是方便快捷方式,不属于承诺规范的一部分.因此,库不需要使它们符合承诺.显然在你的情况下他们不在那里.

您可以使用相同的功能then(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);
   });
Run Code Online (Sandbox Code Playgroud)