gpt4 book ai didi

javascript - 捕获异步等待快速路由处理程序中的所有错误

转载 作者:行者123 更新时间:2023-11-29 10:59:30 25 4
gpt4 key购买 nike

假设我有这样一条路线:

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 不会处理函数返回的 promise 。因此,您需要包装那些 async 处理程序(正如您所做的那样)。

您可以通过在模块顶部给自己一个实用方法来避免每次都这样做:

const appGet = handler => app.get(asyncRoute(handler));

然后使用它代替 app.get:

appGet('/broken', async (req, res) => {
throw new Error('Broken!');
});

在某些时候(可能不是现在),您可能想要查看 Koa .

关于javascript - 捕获异步等待快速路由处理程序中的所有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50047307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com