javascript - 捕获 async-await 快速路由处理程序中的所有错误
问题描述
假设我有这样的路线:
app.get('/broken', (req, res) => {
throw new Error('Broken!');
});
这永远不会向客户端发送响应。
但是,我可以为所有错误添加一个中间件:
const errorMiddleware = (error, req, res, next) => {
if (error) {
console.error(error);
return res.status(500)
.json({
message: 'Internal server error',
});
}
next(error);
};
但这不适用于async
路线,因为它们不throw
直接。
例如,这将不起作用:
app.get('/broken', async (req, res) => {
throw new Error('Broken!');
});
所以我可以像这样创建一个包装器:
const asyncRoute = f => (req, res, next) => {
return Promise.resolve(f(req, res, next)).catch(next);
};
app.get('/broken', asyncRoute(async (req, res) => {
throw new Error('Broken!');
}));
但这真的很痛苦,因为现在我必须为每条路线调用这个函数!
有什么更好的方法来处理这个?
解决方案
从根本上说,您不想直接将async
函数传递给 Express 的app.get
,因为app.get
不处理函数返回的承诺。所以你需要包装这些async
处理程序(就像你正在做的那样)。
您可以通过在模块顶部给自己一个实用方法来避免每次都这样做:
const appGet = handler => app.get(asyncRoute(handler));
然后用它代替app.get
:
appGet('/broken', async (req, res) => {
throw new Error('Broken!');
});
在某些时候(可能不是现在),您可能想查看Koa。
推荐阅读
- html - HTML 找不到样式表信息
- node.js - 过滤和更新数据
- java - 打印带有敏感数据的 HTTPClient 请求参数
- node.js - 监听其他应用程序中发生的事件
- java - Rabbitmq 连接被拒绝,在 linux 服务器上的 docker 容器内运行
- python - Python 函数从另一个函数调用变量。但为什么?
- javascript - 使用现有数组中的匹配键拆分对象
- sql - 带case语句的listagg的正确形式
- git - mac 似乎不是 git 存储库错过了一个斜线
- mongodb - 即使在 mongoDB 中没有使用,如何显示所有可用的数据库列表?