Node.js 在处理之后但在发送到客户端之前,向所有响应添加标题
我在node js应用程序中有两个端点:Node.js 在处理之后但在发送到客户端之前,向所有响应添加标题,node.js,express,Node.js,Express,我在node js应用程序中有两个端点: app.get('search', myGetController); app.post('add', myPostController); 为简单起见,假设两个服务都只有以下代码: exports.myGetController = function(req, res) { res.status(404).json({ error: "not found" }); }; 我希望有一个中间件,在处理控制器之后,但在将它们发送到浏览器之前执行,
app.get('search', myGetController);
app.post('add', myPostController);
为简单起见,假设两个服务都只有以下代码:
exports.myGetController = function(req, res) {
res.status(404).json({ error: "not found" });
};
我希望有一个中间件,在处理控制器之后,但在将它们发送到浏览器之前执行,这样我就可以根据响应的主体添加一个头
// process all responses to add ed25519
app.use(function(req, res, next) {
res.setHeader('CharCount', [How To get Body content]);
next();
});
我有两个问题:
首先,我希望我的所有控制器在处理后都经过该中间件
第二,我想访问主体内容,以便根据其内容生成标题
更新
我尝试了别人发布的建议答案,但它不起作用,或者我遗漏了什么
这是我所拥有的(在设置路线之前):
传递给我的方法的响应是空字符串,即使服务发送的响应不是空的。我是在错误的地方这样做的,还是我遗漏了什么?解决这个问题的一个方法是覆盖
res.json
函数,如下所示:
// process all responses to add ed25519
app.use(function(req, res, next) {
const oldResJson = res.json;
res.json = function(body) {
res.setHeader('CharCount', /* Use body here */);
oldResJson.call(res, body);
}
next();
});
通过这样做,您甚至不需要更改控制器。可能重复@stdob——我尝试过,但在执行中间件时,响应显然是空的。我希望我的所有控制器都有此功能,这不是一个解决方案,因为我必须在所有控制器中复制代码。我想要一个集中的中间件来处理所有的响应,而不是一个接一个的。我的答案与控制器无关。这是一个中间件,您必须为每个要设置标题的控制器放置它。我相信在我放置注释时,您的答案是不同的。尽管如此,我还是尝试了你的答案,这与建议的答案类似,但我无法实现这一点。这是在控制器执行之前执行的,当我尝试处理它时,响应是空的。看看我更新的帖子。我在你更新的问题中看到你在做
generateHeaderBasedOnBody(oldResJson)
但是oldResJson
是一个函数。您应该使用body
,因为它是您在控制器中传递给res.json
的json<代码>生成标题或正文(正文)
// process all responses to add ed25519
app.use(function(req, res, next) {
const oldResJson = res.json;
res.json = function(body) {
res.setHeader('CharCount', /* Use body here */);
oldResJson.call(res, body);
}
next();
});