Node.js中res.sendStatus(status).send(message)是否为无效写法?
问题根因
res.sendStatus(status).send(message)属于对Express API语义理解错误导致的非法写法,报错直接来自这个链式调用的逻辑问题:
res.sendStatus(statusCode)本身就是完整的响应发送方法:调用后会立即设置对应HTTP状态码,将状态码对应的标准描述文本作为响应体推送给客户端,同时终结当前响应流程,此时响应头、响应体都已全部输出,响应通道已经关闭。- 链式追加的
.send(message)相当于在响应完成后再次尝试向客户端写入内容,Node.js HTTP层检测到响应已经发送完毕,就会抛出ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client错误。
移除.send(message)后错误消失,是因为单独调用res.sendStatus()本身就是合法的完整响应流程,不存在重复发送响应的操作。
正确响应写法
根据实际返回需求选择对应写法即可:
- 需要返回自定义文本内容+指定状态码:使用
res.status(statusCode).send(message)注意区分
status()和sendStatus():res.status()仅设置响应状态码,不会终结响应,后续可以链式调用send()、json()等方法写入自定义响应体 - 仅需要返回状态码,不需要自定义消息:直接调用
res.sendStatus(statusCode)即可,方法会自动返回状态码对应的标准描述文本,比如res.sendStatus(403)会默认返回Forbidden作为响应体 - 需要返回JSON格式的响应内容:可以写成
res.status(statusCode).json({ msg: message })
内容的提问来源于stack exchange,提问作者Heron. F
相关产品推荐
相关产品推荐

