【问题标题】:Rejected promise is not reaching catch被拒绝的承诺没有达到目标
【发布时间】:2015-10-19 14:22:03
【问题描述】:

我正在尝试将this method 用于非顺序承诺输出。

express .json 调用成功地从 API 向用户对象发送了 201,但在控制台中,我收到如下所示的未处理拒绝错误。这似乎应该由控制器中的 .catch 处理程序捕获。我想知道为什么会发生这种情况?

用户控制器

module.exports.postUser = function (req, res, next) {

  var user = req.body.user;
  var ip = req.ip;

  userService.createUser(user, ip)
    .then(function (user) {
      res.status(201).json({"user": user.toJSON()});
    })
    .catch(function (err) {
      return next(err);
    });
};

用户服务

module.exports.createUser = function (user, ip) {
  var user = new Promise(function (resolve, reject) {
    return resolve(User.forge(user));
  });

  return user.then(function validateUser(user) {
    return user.validate({validatePassword: true});
  })
    .then(function hash() {
      var password = user.value().get('password');
      return hashPassword(password);
    })
    .then(function setPassword(hashedPass) {
      user.value().set('hashedPass', hashedPass);
      return user.value().save();
    })
    .then(function () {
      return user;
    });
};

输出

Unhandled rejection error: null value in column "status" violates not-null constraint
    at Connection.parseE (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/pg/lib/connection.js:539:11)
    at Connection.parseMessage (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/pg/lib/connection.js:366:17)
    at Socket.<anonymous> (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/pg/lib/connection.js:105:22)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
    at TCP.onread (net.js:538:20)
From previous event:
    at Client._query (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/knex/lib/dialects/postgres/index.js:122:12)
    at Client.query (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/knex/lib/client.js:127:24)
    at Runner.<anonymous> (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/knex/lib/runner.js:118:24)
From previous event:
    at /Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/knex/lib/runner.js:44:21
From previous event:
    at Runner.run (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/knex/lib/runner.js:30:20)
    at QueryBuilder.Target.then (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/knex/lib/interface.js:27:43)
    at null.<anonymous> (/Users/lukel99/webstorm-workspace/rocketwagon-postgres-kickstart/node_modules/bookshelf/lib/model.js:208:36)
    at processImmediate [as _immediateCallback] (timers.js:367:17)

【问题讨论】:

  • 啊,对了,我没注意到user是promise,.value()是同步检查。顺便说一句,有other ways可以解决这个问题,可能比同步检查更好。
  • 太棒了!谢谢你的链接。非常新的承诺,所以建议很感激。

标签: node.js error-handling promise bluebird bookshelf.js


【解决方案1】:

最可能的原因是return user.value().save() 没有返回承诺,而是实现了回调。如果是这种情况,那么错误将在本机承诺 try/catch 块之外抛出,因此不会被捕获,而是您的 .catch()。

【讨论】:

  • 啊 - 所以它没有返回回调,但也没有返回承诺!所以这是对的。我们应用了 save 方法,但没有从它返回承诺,所以它确实是控制器中缺少承诺。谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2018-05-09
  • 2017-03-28
  • 1970-01-01
  • 2015-12-17
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多