Как заставить next () произойти в обратном вызове Express, возвращающем Bluebird Promise? - PullRequest
0 голосов
/ 13 мая 2019
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 (), но это не так. Это просто дает мне необработанную ошибку отклонения Обещания, и ответ не переходит к следующему обратному вызову, который отправит запрос со статусом 500 и сообщением об ошибке.

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

1 Ответ

0 голосов
/ 14 мая 2019

Ваше использование промежуточного программного обеспечения не правильно Вы не вернете 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?
}
...