表示中间件有条件地更改响应结果



我想要实现的是,当快速处理程序通过抛出未处理的异常或返回空响应(如undefined[])而失败时,我希望处理程序返回预定义的模拟响应而不是失败。这意味着我的服务器永远不会失败,因为它要么返回正常的真实数据,要么返回预定义的模拟数据。当然,我只会在开发环境中打开它,而不会在生产环境中打开它。

我认为中间件是理想的,因为我不想通过注入响应检查来污染每个处理程序逻辑。

这是可能的中间件在express?如果不是,有什么更干净的方法来实现这个目标?

中间件处理程序的返回值是无关的,因为中间件处理程序本质上是异步的。它做以下三件事之一:

  • 通过调用res.end(...)或类似方法完成响应。
  • 调用next(err)报告错误。
  • 通过调用next()将决策委托给下一个中间件。

错误可以通过额外的错误处理中间件捕获,并且异常可以转换为错误,如[ExpressJs]中所讨论的:自定义错误处理程序不捕获异常。

但是,您不能在发送响应之后更改响应。而且,你写

一个快速处理程序失败…由……返回空响应

,但空响应不是失败。如果您希望将空响应视为失败,但仅在生产环境中,我建议您将它们作为特殊错误处理。而不是用res.json([])来响应,例如,您编写next({emptyResponse: []}),并在开发中使用特殊的错误处理中间件,只有来处理这些错误:

app.use(function(err, req, res, next) {
if (err.emptyResponse) {
console.error(err.emptyResponse);
res.end("Mock response");
} else next(err);  // delegate to the standard error handler
});

也许人们对什么是回应有误解。服务器将响应流发送给客户端,只有客户端可以"获取"。在这个意义上的反应。响应不能在中间件之间传递。

最新更新