嘿,我在嘗試實作 2 個資源時遇到了同樣的問題:我需要它們,但我收到錯誤訊息:“錯誤 [ERR_HTTP_HEADERS_SENT]:在發送到客戶端后無法設定標頭”。那么我怎樣才能只制作一個包含 2 條陳述句的 res 呢?我知道我可以將重定向函式中的狀態作為第一個引數,但是 json 訊息呢?
module.exports = (app) => {
app.get("/api/logout", (req, res) => {
res.cookie('jwtCookie', '', {
maxAge: 1
});
res.status(200).json({ message: "user disconnected" });
res.redirect('/');
});
};
uj5u.com熱心網友回復:
每個傳入的 http 請求只能發送一個回應。而且,在您的代碼中,這兩個都嘗試發送回應:
res.status(200).json({ message: "user disconnected" });
res.redirect('/');
第一行發送狀態為 200 的 JONS 回應。第二行res.redirect()發送 302 回應并設定Location標頭。
因為 Express 可以看到您已經使用第一行發送了一個回應,所以當您嘗試使用第二行代碼發送第二個回應時,它會給您一條錯誤訊息。
因此,您必須決定是發送 JSON 回應還是發送重定向。選擇其中之一。您不能發送兩個單獨的回應。
由于您首先發送 JSON,因此另一端的客戶端似乎是某種代碼(例如網頁中的 Ajax 呼叫)。如果是這種情況,您可以在 JSON 回應中包含重定向位置,然后依靠客戶端進行自身重定向。
事實證明,如果客戶端是可編程客戶端,例如網頁 Javascript 中的 Ajax 呼叫,則重定向無論如何都不會導致瀏覽器更改網頁。如果這是你想要發生的,你必須讓客戶端 Javascript 實作。
所以,你可以這樣做:
module.exports = (app) => {
app.get("/api/logout", (req, res) => {
res.cookie('jwtCookie', '', {
maxAge: 1
});
res.status(200).json({
message: "user disconnected",
redirect: "/"
});
});
};
然后,另一端的 Javascript 客戶端將查找redirect回應物件上的屬性,如果存在,它將設定window.location為新值以導致瀏覽器更改它正在查看的頁面。
或者,如果您希望客戶端實際查找 302 回應并Location從該回應中獲取標頭,則可以執行以下操作:
module.exports = (app) => {
app.get("/api/logout", (req, res) => {
res.cookie('jwtCookie', '', {
maxAge: 1
});
res.location('/');
res.status(302).json({
message: "user disconnected"
});
});
};
uj5u.com熱心網友回復:
您必須重定向用戶的瀏覽器或發送 JSON 訊息。您不能為一個請求同時執行這兩項操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363717.html
