[英]Add header to all responses after processing but before sending to client
我在節點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();
});
我有兩個問題:
首先,我希望所有的控制器在處理后都通過該中間件傳遞。
其次,我想訪問正文內容,以便可以基於其內容生成標頭。
UPDATE
我已經嘗試了某人發布的建議答案,但它不起作用,或者我遺漏了一些東西。
這是我所擁有的(在設置路線之前):
app.use(function(req, res, next) {
const oldResJson = res.json;
res.json = function(body) {
res.setHeader('myToken', generateHeaderBasedOnBody(oldResJson));
oldResJson.call(res, body);
}
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();
});
這樣,您甚至不需要更改控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.