Node.js运行http服务器出现write after end错误如何解决?
错误成因解释
你触发的ERR_STREAM_WRITE_AFTER_END错误核心原因是:HTTP响应流res在调用res.end()方法后就已经被关闭,不能再向已经关闭的流写入任何内容,你的代码逻辑恰好触发了这一规则。
你的代码逻辑存在流程漏洞:
- 当访问
/路径时,第一个if判断命中,执行res.end('Home Page')关闭响应流后,代码不会终止运行,会继续向下执行 - 第二个
if判断不命中跳过,最后一行res.end('Error')被触发,尝试向已经关闭的流写入内容,直接抛出错误 - 访问
/about路径同理,第二个if命中执行res.end后,还是会执行最后的res.end('Error'),同样会触发报错
修复方案
有两种常用的修复方式,二选一即可:
方案1:使用if-else分支阻断多分支执行
const http = require('http') const server = http.createServer((req, res)=> { if(req.url === '/') { res.end('Home Page') } else if(req.url === '/about') { res.end('About us') } else { res.end('Error') } }) server.listen(3000, ()=>{ console.log('Server listening...'); })
该方案通过else分支确保同一时间只会命中一个响应逻辑,不会重复调用res.end。
方案2:在每个响应逻辑后添加return终止函数执行
const http = require('http') const server = http.createServer((req, res)=> { if(req.url === '/') { res.end('Home Page') return } if(req.url === '/about') { res.end('About us') return } res.end('Error') }) server.listen(3000, ()=>{ console.log('Server listening...'); })
该方案通过return直接终止请求处理函数的后续执行,避免后续的res.end被调用。
内容的提问来源于stack exchange,提问作者Johny
相关产品推荐
相关产品推荐

