You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:57:03