resExpress中的对象是Node.js的
http.ServerResponse子类(请阅读http.js源代码)。允许您拨打任意数量的电话
res.setHeader(name,value),直到致电为止
res.writeHead(statusCode)。之后
writeHead,将标题放进去,您只能调用
res.write(data),最后
res.end(data)。
错误“错误:发送标头后无法设置标头”。表示您已经处于“正文”或“完成”状态,但是某些函数试图设置标头或statusCode。当您看到此错误时,请尝试查找在某些正文已被写入之后尝试发送标头的任何内容。例如,查找意外调用两次的回调,或发送正文后发生的任何错误。
在您的情况下,您致电
res.redirect(),这导致响应变为“完成”。然后,您的代码引发了错误(
res.reqis
null)。并且由于该错误发生在您的实际错误
function(req, res,next)(而不是回调)之内,因此Connect能够捕获该错误,然后尝试发送500错误页面。但是,由于已经发送了标头,所以Node.js
setHeader抛出了您看到的错误。
Node.js / Express响应方法的完整列表以及何时调用它们:
回复必须在 标题中, 并保持在 标题中 :
- res.writeContinue()
- res.statusCode = 404
- res.setHeader(name, value)
- res.getHeader(name)
- res.removeHeader(name)
- res.header(key[, val]) (Express only)
- res.charset = ‘utf-8’ (仅Express;仅影响Express特定的方法)
- res.contentType(type) (Express only)
响应必须在头脑中,然后变成身体:
res.writeHead(statusCode, [reasonPhrase], [headers])
响应可以是头部/身体,也可以是身体:
res.write(chunk, encoding='utf8')
响应可以是Head / Body,也可以是Finished:
res.end([data], [encoding])
响应可以处于Head / Body,也可以保持其当前状态:
res.addTrailers(headers)
响应必须在标题中,并已完成:
- return next([err]) (仅连接/快速)
- 中间件中的任何异常function(req, res, next)(仅适用于Connect / Express)
- res.send(body|status[, headers|status[, status]]) (Express only)
- res.attachment(filename) (Express only)
- res.sendfile(path[, options[, callback]]) (Express only)
- res.json(obj[, headers|status[, status]]) (Express only)
- res.redirect(url[, status]) (Express only)
- res.cookie(name, val[, options]) (Express only)
- res.clearcookie(name[, options]) (Express only)
- res.render(view[, options[, fn]]) (Express only)
- res.partial(view[, options]) (Express only)



