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();};
添加回答
举报