Node.js:如何以正确的方式处理 promise 更改

标签 node.js express promise bluebird

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

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

我使用 bluebird 来实现 promise 。

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. 在链的某些 then 中,我返回具体值(如 token ),在其他一些情况下,我返回 promise 。看起来 Bluebird 可以处理这两种情况并且不会中断链条(这实际上让我感到困惑,因为我返回的数字没有 then-method

最佳答案

我建议不要使用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 完成,它就会使用该 Promise 的返回值进行解析,否则它会立即使用回调返回的任何内容进行解析。

您可以看出情况一定如此,因为当 then 返回时,它还不知道您传递给它的回调的返回值。所以它必须总是返回相同的东西;在这种情况下,是一个 promise 。

关于Node.js:如何以正确的方式处理 promise 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077306/

相关文章:

javascript - 值得删除大型代码库中未使用的导入吗?

node.js - ejs文件中的相对路径

javascript - Node API等待外部数据

database - passportjs 和 passportlocal 添加用户 "Error: failed to serialize user into session"

javascript - 如何在 Node.js 中添加 promise.all Sequelize findOrCreate 循环?

javascript - AngularJS - 在不使用 $timeout 的情况下调用书签布局

node.js - 需要一些关于 promise 中的 promise 以及如何更好地编写它的建议

javascript - 如何在 Node.js 中终止 Python-Shell 模块进程?

javascript - 相当于 Node.js 中的 laravel 风格的服务提供者(或 wp 风格的插件)

node.js - 并且偶尔会在 shell 和 Node native 驱动程序上产生错误的结果