3 回答
TA贡献1812条经验 获得超5个赞
resExpress中的对象是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();};添加回答
举报
