如何让 next() 在返回 Bluebird Promise 的 Express 回调中发生?

How to get next() to occur in Express callback returning a Bluebird Promise?

exports.verifyReCAPTCHA = function(req, res, next) {
  return new Promise((resolve, reject) => {
    let recaptcha = new Recaptcha(process.env.RECAPTCHA_SITE_KEY, process.env.RECAPTCHA_SECRET_KEY, recaptchaData);
    recaptcha.verify((success, error_code) => {
      if (success) {
        return resolve()
      }
      return reject(next(new Error(error_code)))
    })
    return reject(next(new Error('Unknown error occured!')))
  })
}

我故意未定义 recaptchaData 以查看返回的错误是否会传递给 next(),但它们不会。它只是给我一个未处理的 Promise 拒绝错误,并且响应不会传递到下一个回调,它将发送状态为 500 的请求和错误消息。

app.post('/contact/send', contact.verifyReCAPTCHA, contact.send);

您的中间件用法不正确您没有return来自中间件的Promise因为express不会调用.then你们。看起来您正在尝试链接中间件。方法如下:

exports.verifyReCAPTCHA = function(req, res, next) {
  let recaptcha = new Recaptcha(process.env.RECAPTCHA_SITE_KEY, process.env.RECAPTCHA_SECRET_KEY, recaptchaData);
  recaptcha.verify((success, error_code) => {
    if (success) {
      return next(); // <-- calling next(), go to next middleware
    }
    return next(new Error(error_code))
  })
  next(new Error('Unknown error occured!')) // <-- not sure where this is originating from, try..catch perhaps?
}