Node.js搭建HTTP服务器访问路由报ERR_STREAM_WRITE_AFTER_END错误如何解决
问题原因分析
ERR_STREAM_WRITE_AFTER_END错误的核心触发原因是:HTTP响应流res在调用res.end()关闭后,又被执行了写入/关闭操作。
对应你的代码逻辑问题:
你的路由判断用了三个独立的无流程截断的if分支:
- 当访问
/路径时,第一个if匹配成功,执行res.end('Home Page')关闭响应流 - 代码不会停止运行,会继续执行后续的第二个if判断(不匹配),然后走到最后的
res.end('Error page') - 此时流已经关闭,再次调用
res.end()就抛出对应错误,访问/about路径时同理,也会触发最后一行的res.end()
修复方案
有两种常用的修复方式,任选一种即可:
方案1:每个路由分支增加return截断流程
在每个res.end()前加return,匹配到路由后直接终止后续代码执行:
const http = require('http'); const PORT = 5001; const server = http.createServer((req, res) => { if(req.url === '/'){ return res.end('Home Page') } if(req.url === '/about'){ return res.end('About Page') } res.end('Error page') }) server.listen(PORT, () => { console.log(`Server is listening on port: ${PORT}`) })
方案2:改用if-else if-else分支结构
用关联分支保证同一时间只会命中一个逻辑分支:
const http = require('http'); const PORT = 5001; const server = http.createServer((req, res) => { if(req.url === '/'){ res.end('Home Page') } else if(req.url === '/about'){ res.end('About Page') } else { res.end('Error page') } }) server.listen(PORT, () => { console.log(`Server is listening on port: ${PORT}`) })
修复后访问任意路由都只会执行一次res.end(),不会再触发流重复写入的错误。
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

