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

NodeJS开发API接口遇ERR_STREAM_WRITE_AFTER_END错误,服务器崩溃

问题分析与修复方案

错误原因

你遇到的ERR_STREAM_WRITE_AFTER_END错误,本质是在HTTP响应已经通过res.end()结束后,代码又尝试向响应流写入数据或再次调用res.end()。错误栈指向handleReqRes.js第52行,说明问题出在这个文件的请求响应处理逻辑里。

常见问题场景及修复

1. 重复调用res.end()

最可能的情况是你的handleReqRes函数中,在某个分支已经结束了响应,后续逻辑又再次调用了res.end()。比如在req.end事件回调外提前结束了响应,之后事件触发又执行一次结束操作。

错误示例:

// handleReqRes.js 错误代码片段
function handleReqRes(req, res) {
  // 提前结束响应
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end(JSON.stringify({msg: 'initial response'}));

  // 监听请求结束事件,再次调用res.end()
  req.on('end', () => {
    res.end(); // 这里触发错误:响应已结束
  });
}

修复后代码:

确保只在请求体完全接收后(req.end事件内)处理并结束响应:

// handleReqRes.js 修复后代码
function handleReqRes(req, res) {
  let requestBody = '';

  // 收集请求体数据
  req.on('data', (chunk) => {
    requestBody += chunk.toString();
  });

  // 请求体接收完成后统一处理响应
  req.on('end', () => {
    // 根据业务逻辑处理请求
    const responseData = {
      status: 'success',
      receivedBody: requestBody || '无请求体'
    };

    res.writeHead(200, {'Content-Type': 'application/json'});
    // 仅调用一次res.end()
    res.end(JSON.stringify(responseData));
  });

  // 捕获请求错误,避免崩溃
  req.on('error', (err) => {
    console.error('请求处理错误:', err);
    res.writeHead(400, {'Content-Type': 'application/json'});
    res.end(JSON.stringify({error: '请求无效'}));
  });

  // 捕获响应错误,避免崩溃
  res.on('error', (err) => {
    console.error('响应发送错误:', err);
  });
}

module.exports = { handleReqRes };

2. 逻辑分支处理不当

如果你的代码中有条件判断,可能某个分支已经调用res.end(),但后续代码没有通过return终止执行,导致继续执行到写入响应的逻辑。

错误示例:

if (req.url === '/health') {
  res.end('OK');
}
// 后续代码继续写入响应
res.write('其他内容');
res.end();

修复:

在分支结束响应后添加return,终止后续逻辑:

if (req.url === '/health') {
  res.end('OK');
  return; // 终止后续代码执行
}
// 其他逻辑
res.write('其他内容');
res.end();

额外防护:防止服务器崩溃

单个请求的未捕获错误可能导致整个服务器崩溃,建议给服务器添加错误监听:

在主文件的createServer函数中修改:

app.createServer = () => {
    const server = http.createServer(app.handleReqRes);
    
    // 监听服务器错误
    server.on('error', (err) => {
      console.error('服务器异常:', err);
    });

    server.listen(app.config.port, () => {
        console.log(`listening to port ${app.config.port}`);
    });
};

内容的提问来源于stack exchange,提问作者Rafid Rabbii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:04:51