修正 Node.js 中的 ERR_HTTP_HEADERS_SENT 問題
對於使用 Node.js 的開發人員來說,ERR_HTTP_HEADERS_SENT 錯誤是一個常見的陷阱。當伺服器嘗試為單一 HTTP 請求發送多個回應時,通常會出現此錯誤,從而導致意外行為和應用程式崩潰。
ERR_HTTP_HEADERS_SENT 錯誤的主要原因是濫用 res.send()、res.json() 或 res.redirect() 等回應方法。當您的程式碼無意中多次呼叫這些方法之一時,伺服器會在發送其他標頭後嘗試發送其他標頭,從而導致錯誤。
範例場景
考慮以下程式碼片段,它演示瞭如何發生此錯誤:
app.get('/app', async function(req, res) { // Avoid doing this! You must ensure only one response is sent. await User.find({ username: req.headers.username }, function(err, items) { res.send('User data retrieved.'); // First response }); res.send('Hello, World!'); // Second response, leading to ERR_HTTP_HEADERS_SENT }); In this example, the res.send('Hello, World!') call executes after res.send('User data retrieved.'), which triggers the error.
另一個 res.redirect 範例
res.redirect 方法也可能出現此問題,如下所示:
app.get('/app', function(req, res) { // Don't do this! Only one response should be sent. await User.find({ username: req.headers.username }, function(err, items) { res.redirect('/app/login'); // First response }); res.send('Welcome!'); // Second response, which will cause the error
});
正確的解
為了防止 ERR_HTTP_HEADERS_SENT 錯誤,請確保您的程式碼僅為每個請求發送一個回應。以下是修改前面範例的方法:
更正範例:
app.get('/app', async function(req, res) { const user = await User.find({ username: req.headers.username }); if (user) { res.send('User data retrieved.'); // Send response only once } else { res.redirect('/app/login'); // Or redirect as needed } });
總之,請務必檢查您的回應邏輯,以確保每個要求僅產生一個回應。透過這樣做,您可以避免 ERR_HTTP_HEADERS_SENT 錯誤並保持 Node.js 應用程式的穩定性。
以上是修復 Node.js 中的 HTTP 標頭發送錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!