3 回答

TA貢獻1812條經驗 獲得超5個贊
res
Express中的對象是Node.js的http.ServerResponse
子類(讀取http.js源代碼)。您可以隨時撥打電話res.setHeader(name, value)
,直到您打電話為止res.writeHead(statusCode)
。之后writeHead
,標題被烘焙,您只能調用res.write(data)
,最后res.end(data)
。
錯誤“錯誤:發送后無法設置標頭”。表示您已處于Body或Finished狀態,但某些函數嘗試設置標題或statusCode。當您看到此錯誤時,嘗試查找在已經寫入某些正文后嘗試發送標頭的任何內容。例如,查找意外調用兩次的回調,或發送正文后發生的任何錯誤。
在你的情況下,你打電話res.redirect()
,導致響應成為完成。然后你的代碼拋出一個錯誤(res.req
是null
)。并且由于錯誤發生在您的實際內function(req, res, next)
(不在回調中),Connect能夠捕獲它,然后嘗試發送500錯誤頁面。但由于標題已經發送,Node.js setHeader
拋出了你看到的錯誤。
Node.js / Express響應方法的完整列表以及何時必須調用它們:
回復必須在Head并保持在Head:
res.header(key[, val])
(僅限快遞)res.charset = 'utf-8'
(僅限Express;僅影響特定于Express的方法)res.contentType(type)
(僅限快遞)
響應必須在Head并成為Body:
響應可以在頭部/身體中,并保留在身體中:
響應可以在頭部/身體中完成并且完成:
響應可以在頭部/身體中,并保持其當前狀態:
響應必須在Head并且已完成:
return next([err])
(僅限連接/快速)中間件中的任何異常
function(req, res, next)
(僅限Connect / Express)res.attachment(filename)
(僅限快遞)res.redirect(url[, status])
(僅限快遞)res.partial(view[, options])
(僅限快遞)

TA貢獻1853條經驗 獲得超9個贊
我有同樣的問題并且意識到這是因為我在res.redirect
沒有return
聲明的情況下進行調用,所以next
之后也立即調用了該函數:
auth.annonymousOnly = function(req, res, next) { if (req.user) res.redirect('/'); next();};
應該是:
auth.annonymousOnly = function(req, res, next) { if (req.user) return res.redirect('/'); next();};
添加回答
舉報