Node.js HTTP服务返回204 NO CONTENT时响应挂起如何解决
问题根因
HTTP 规范明确规定 204 No Content 响应禁止包含任何响应体,即便是空字符串也不允许。
你代码中调用了 response.write() 方法,哪怕传入的是空字符串,Node.js 原生 HTTP 模块也会自动为响应添加 Transfer-Encoding: chunked 头,而该头部是不允许出现在 204 响应中的。这会导致客户端误认为当前响应有分块的响应体需要接收,就会一直等待数据传输,最终触发超时。
解决方案
直接删除 response.write() 调用即可,设置状态码后直接调用 response.end() 结束响应:
response.statusCode = 204; // 无需执行任何response.write操作 response.end();
如果你的业务逻辑需要兼容普通响应和 204 这类无响应体的响应,可以加一层状态码判断再决定是否写入响应体:
// 所有不允许携带响应体的HTTP状态码 const NO_BODY_STATUS = new Set([204, 205, 304]); const statusCode = 204; response.statusCode = statusCode; // 只有非无体状态码、且有实际响应内容时才写入body if (!NO_BODY_STATUS.has(statusCode) && preparedBody) { response.write(preparedBody); } response.end();
内容的提问来源于stack exchange,提问作者Trevor Sears
相关产品推荐
相关产品推荐

