3 回答

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

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
我有同樣的問(wèn)題并且意識(shí)到這是因?yàn)槲以?code>res.redirect沒(méi)有return
聲明的情況下進(jìn)行調(diào)用,所以next
之后也立即調(diào)用了該函數(shù):
auth.annonymousOnly = function(req, res, next) { if (req.user) res.redirect('/'); next();};
應(yīng)該是:
auth.annonymousOnly = function(req, res, next) { if (req.user) return res.redirect('/'); next();};
添加回答
舉報(bào)