假设我有这样的路线:
input[type=submit]{
margin:0.6em 2em 1em 1em; /* Right margin (2nd value) is now working */
这绝不会向客户发送回复。
但是,我可以为所有错误添加中间件:
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!');
}));
答案 0 :(得分:2)
从根本上说,您不希望直接将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。