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" }); }; 我希望有一个中间件,在处理控制器之后,但在将它们发送到浏览器之前执行,

我在node js应用程序中有两个端点:

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();
});