我有一个同构的 react 应用程序,我想以某种方式在快速中间件之间传递状态。
我有以下处理表单提交的快速路由:
export const createPaymentHandler = async (req: Request, res: Response, next: NextFunction) => {
const { field } = req.body;
if (!paymentType) {
res.locals.syncErrors = { field: 'some error.' };
next();
return;
}
try {
const { redirectUrl } = await makeRequest<CreatePaymentRequest, CreatePaymentResponse>({
body: { paymentType },
method: HttpMethod.POST
});
res.redirect(redirectUrl);
} catch (err) {
error(err);
res.locals.serverError = true;
next();
}
};
下一个中间件是处理渲染。
目前我正在使用
res.locals
,有没有更好的方法或公认的模式? 最佳答案
因为您的处理程序是异步的,所以您需要将 err
传递给 next
,如下所示:
next(err);
为了让您的中间件处理错误,而不是由默认错误处理程序接收,您需要有四个参数:
app.use((err, req, res, next) => {
// handle the error
})
还值得注意的是,需要在其他中间件之后指定错误处理程序。对于您的情况,将普通的“成功”中间件与错误处理程序一起使用可能更有意义,而不是将两者合并为一个中间件。
最后,请记住,将
err
作为参数传递是特定于错误处理程序的。如果您只想将一些数据传递到下一个中间件,您可以通过修改 req
来实现:req.x = 'some data'
next()
然后,下一个中间件的
req
参数将包含您设置的数据。进一步阅读:https://expressjs.com/en/guide/using-middleware.html#middleware.error-handling