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

Node.js搭建Minecraft控制API触发ERR_STREAM_WRITE_AFTER_END报错排查

问题原因

根因分析

  1. 异步逻辑与全局res.end()提前执行冲突
    child_process.exec是异步非阻塞方法,执行start/stop等涉及exec的逻辑时,代码不会等待exec的回调执行完成,会直接向下运行到请求处理函数末尾的res.end();,提前关闭HTTP响应流。等exec回调触发时再执行res.end()/res.write(),就会触发ERR_STREAM_WRITE_AFTER_END报错。
    你测试时把res.write换成res.end依然拿不到返回值,也是因为全局的res.end()已经先把响应发走了,回调里的res.end根本不会生效。

  2. 分支逻辑缺少return中断执行
    很多分支判断里执行完res.end()后没有加return,比如if(q.sname == undefined) res.end("Server name not specified.");,执行完res.end后代码依然会向下运行,可能触发后续重复的响应操作。

解决方法

步骤1:移除全局兜底的res.end(),或增加执行条件

末尾的res.end()只在未进入密码校验分支、或未匹配到有效action时执行,已经在分支内处理完响应的请求不需要再走这行逻辑。

步骤2:所有res.end()执行后加return中断后续逻辑

所有分支判断中的res.end()都修改为return res.end(xxx),确保执行完响应后直接跳出当前逻辑,不会继续执行后续代码。例如:

// 修改前
if(q.sname == undefined) res.end("Server name not specified.");
// 修改后
if(q.sname == undefined) return res.end("Server name not specified.");

步骤3:补全异步回调内的错误处理

exec报错的分支不要只打控制台日志,也要调用res.end()返回错误信息,避免请求挂起:

if (error) {
  console.error("Error: ", error);
  return res.end("操作执行失败:" + error.message);
}

示例修正片段(stop逻辑)

case "stop":
  // 加return中断
  if(q.sname == undefined) return res.end("Server name not specified.");
  if (fs.existsSync('./servers/' + q.sname + '.json')) {
    exec('screen -S ' + q.sname + ' -Q select . ; echo $?',
    (error, stdout, stderror) => {
      // 报错也返回响应
      if (error) {
        console.error("Error: ", error);
        return res.end("查询服务状态失败:" + error.message);
      }
      var out = stdout;
      if(out.includes('0')){
        exec('screen -p 0 -S minecraft-server -X eval `stuff "say TEST MESSAGE..."\015`', (error, stdout, stderror) => {
          if (error) {
            console.error("Error: ", error);
            return res.end("停止服务失败:" + error.message);
          }
          return res.end("Server stopped!");
        });
      } else {
        return res.end('Server already stopped!');
      }
    });
  } else {
    // 加return
    return res.end("Server does not exist!");
  }
  break;

内容的提问来源于stack exchange,提问作者Samuel Overduib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:57:03