【问题标题】:Node.js: How to handle promise-changing in a proper wayNode.js:如何以正确的方式处理承诺变更
【发布时间】:2015-11-11 16:17:48
【问题描述】:

我有一个 Node.js (express.js)-Server,我在其中提供了一个简单的 auth-api。

在我的一条路线中,我在返回“资源”之前更改了很多子步骤。

我正在使用 bluebird 作为承诺。

router.post('/register', function(req, res, next) {

      // ------- 1. check if already existing
      var p = store.checkIfExisting(req, res) //-->mongoose .find(). Returns promise
        .then(function(isExisting) {
          if (isExisting) {
            console.log("try to cancel");
            p.cancel();
          }
          // ------- 2. Facebook validation
          return validateFacebookSignedRequest(req.body.fbsrCookie); //True/False
        })
        .then(function(fbIsValid) {
          // ------- 3. create Users
          return store.saveUser(req, res); // --> mongoose.save(). Returns promise
        })
        .then(function(user) {
          // ------- 4. Token generieren
          return store.generateTokenForFbUID(req, res);
        }).then(function(token) {
          // ------- 5. send back the token
          res.send({
            success: true,
            message: token
          });
        })
        .cancellable()
        .catch(function(err) {
          console.log("canceled");
        });
});

所以我想知道...

  1. 在检测到某些错误时如何中断链 子步骤(现在我使用p.cancel();

  2. 在链的某些thens 中,我正在返回具体值(如令牌),在其他一些情况下,我正在返回承诺。似乎蓝鸟可以同时处理这两种情况并且不会中断链条(这实际上让我感到困惑,因为我返回的数字没有then-method

【问题讨论】:

    标签: node.js express promise bluebird


    【解决方案1】:

    我建议不要使用cancellable。这很少是你想要的,在这种情况下当然不是。你应该抛出一个错误:

      var p = store.checkIfExisting(req, res)
        .then(function(isExisting) {
          if (isExisting) {
            throw new NotFoundError(); // Some custom error type
          }
          return validateFacebookSignedRequest(req.body.fbsrCookie);
        })
        // ...more steps...
        .then(function(token) {
          res.send({
            success: true,
            message: token
          });
        })
        .catch(NotFoundError, function(err) {
          // whatever you do when its not found
        });
    

    然后你可以捕获其他错误类型,如果有的话。

    对于第二个问题,thencatch 等总是返回承诺。您向它们传递一个回调,它们会对该回调返回的内容进行操作。如果返回了一个 Promise,它会在该 Promise 完成后使用该 Promise 的返回值进行解析,否则它会立即使用回调返回的任何内容进行解析。

    你可以说一定是这样,因为当then 返回时,它还不知道你传递给它的回调的返回值。所以它必须总是返回相同的东西;在这种情况下,是一个承诺。

    【讨论】:

    • 非常有帮助。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2020-02-19
    • 2018-06-10
    相关资源
    最近更新 更多