如何让 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?
}
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?
}