node.js - 破坏 promise 链 - 停止执行下一个 'then'

标签 node.js express asynchronous promise

我正在 Node/Express 中编写一个注册系统,并且我正在尝试使用 Promise。

问题是我在使用它们时收到错误消息:

错误:

(node:64725) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2):

有没有办法在then处停下来?

auth.isRegistered(email)
.then((registered) => {
    if ( !registered ) {
        req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.');
        req.session.user = user;
        res.redirect('/register')
    }
})
.then(() => {
    return auth.isVerified(email);
})
.then((verified) => {
    if ( !verified ) {
        console.log('please verify');
        res.redirect('/register/verify');
    } else {
        req.login(user, err => {
            if ( err ) return next(err);
            req.session.timestamp = Date.now();
            auth.updateLastLogin(email)
            .then(() => {
                res.redirect(req.session.returnTo || '/account');
            });
        });
    }
});

最佳答案

您可以执行以下操作:

  1. 当您想要破坏 promise 链时,引发自定义错误。
  2. 检查 catch 回调,发现抛出的错误是自定义错误。如果是这样,则继续,否则使用 error 对象调用 next:

示例:

let getBreackChainError = () => {
  let err = new Error();
  err.name = 'BreackChainError';
  return err;
};

auth
  .isRegistered(email)
  .then(registered => {
      if (!registered) {
        req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.');
        req.session.user = user;
        res.redirect('/register');
        throw getBreackChainError();
      }
      return auth.isVerified(email);
  })
  .then(verified => {
      if (!verified) {
        console.log('please verify');
        res.redirect('/register/verify');
        throw getBreackChainError();
      }
      return new Promise((resolve, reject) => {
        req.login(user, err => {
          if (err) {
            return reject(err);
          }
          req.session.timestamp = Date.now();
          resolve();
        });
      });
  })
  .then(() => auth.updateLastLogin(email))
  .then(() => res.redirect(req.session.returnTo || '/account');
  .catch(err => {
    if (err.name !== 'BreackChainError') {
      next(err);
    }
  });

注意。您不应该将回调与 promise 混合在一起,而应使用其中之一。在上面的示例中,我 promise req.login,所以现在它返回一个 promise 。

关于node.js - 破坏 promise 链 - 停止执行下一个 'then',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46610614/

相关文章:

javascript - npm install 上的 node-pre-gyp 安装错误

node.js - Node.js 中的非阻塞或异步 I/O 是什么?

node.js - "import"语句在使用 React js 的服务器端渲染中如何工作?

node.js - 如何等待所有 Node 流完成/结束?

c# - Async/Await 方法 - 无需等待方法执行

javascript - Mocha : get stacktrace when running mocha programmatically

node.js - 在 node.js 中编码/加密 Azure Log Analytics 授权 header

javascript - 如何在 Sequelize 中对嵌套关联进行计数?

javascript - 如何在 Node.js 中请求图像和输出图像

c - 在 C 中编写异步事件服务器的推荐模式