我正在使用express创建REST API,遵循this article中的体系结构。 简而言之,路由器正在调用控制器。
这是一个通话示例:
router.get('/', ModelsController.getModels)
到目前为止,这项工作还不错,现在,我正在改善Boom的错误处理。
我想像this article中那样使用包装器,但是由于我不使用TS,并且我不熟悉Promises,所以我为此感到困惑。
这是包装纸:
exports.enhanceHandler = async function (handler) {
return async function (req, res, next) {
try {
const result = await handler(req, res);
if (result instanceof Error && Boom.isBoom(result)) {
res.status(result.output.statusCode).send(formatBoomPayload(result));
}
} catch (error) {
// now log errors to your errors reporting software
if (process.env.NODE_ENV !== "production" && (error.stack || error.message)) {
res.status(500).send(error.stack || error.message);
} else {
res.status(500).send(Boom.internal().output.payload);
}
}
next();
}
}
我正试图在路由器中调用它,就像这样:
router.get('/handler', enhanceHandler(ModelsController.getModels))
但是,我遇到了这个错误:
Error: Route.get() requires a callback function but got a [object Promise]
我该怎么办?我需要兑现诺言吗?修改EnhanceHandler以便它返回一个函数而不是一个Promise?
答案 0 :(得分:3)
每个promise对象都有一个.then方法,您需要使用.then方法从promise对象中获取结果,例如:
handler(req, res).then((res) => {
if (res instanceof Error && Boom.isBoom(res)) {
res.status(res.output.statusCode).send(formatBoomPayload(res));
}
});
如果我们不再使用等待,我们还可以从函数中删除异步。
答案 1 :(得分:1)
让我们看看发生了什么。 您已经调用了get(),并为第二个参数使用了EnhanceHandler()调用。 任何异步功能的调用都会返回Promise 。 而get需要一个函数引用作为第二个参数。
因此,首先必须避免在为get()提供第二个参数的函数上使用async关键字。