簡體   English   中英

將標頭添加到處理后但發送給客戶端之前的所有響應中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM