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

Node.js代码出现Write after end错误,求排查解决方法

解决Node.js中"Write after end"错误的问题

我来帮你搞定这个问题——这个错误的核心原因完全是异步操作的执行顺序搞反了!

你代码里的fs.open是异步方法,它不会卡住后续代码的执行。也就是说,当你调用fs.open之后,JavaScript会直接跳到后面执行res.end(),把HTTP响应给提前结束了。等fs.open的回调函数触发的时候,响应已经被关闭,这时候再调用res.write(fd)自然就会抛出"Write after end"的错误。

解决办法:调整代码执行顺序

把res.end()移到fs.open的回调函数内部,确保只有在完成响应内容的写入之后,才结束响应。另外还要注意,fd是数字类型的文件描述符,直接res.write(fd)会把它转成字符串输出,如果这不是你想要的,后面我也会给出读取文件内容的优化方案。

修改后的代码如下:

import http = require('http'); 
const fs = require("fs"); 
var port = process.env.port || 8888 
var i = 1; 

http.createServer(function (req, res) { 
  res.writeHead(200, { "Content-Type": "text/html" }); 
  console.log(i++ + "\n" + req.connection.remoteAddress); 
  
  fs.open('1.html', "a+", (error, fd) => { 
    // 先处理可能出现的文件操作错误,避免服务崩溃
    if (error) {
      res.write('Error opening file: ' + error.message);
      res.end();
      return;
    }
    res.write(fd.toString()); // 将文件描述符转为字符串输出
    res.end(); // 在这里结束响应,确保写入操作完成后再关闭
  }); 
}).listen(port);

额外优化:如果需要返回文件内容

如果你的实际需求是读取1.html的内容并返回给客户端,用fs.readFile会更简洁,不需要手动处理文件描述符,示例代码:

import http = require('http'); 
const fs = require("fs"); 
var port = process.env.port || 8888 
var i = 1; 

http.createServer(function (req, res) { 
  res.writeHead(200, { "Content-Type": "text/html" }); 
  console.log(i++ + "\n" + req.connection.remoteAddress); 
  
  fs.readFile('1.html', 'utf8', (error, data) => { 
    if (error) {
      res.write('Error reading file: ' + error.message);
      res.end();
      return;
    }
    res.write(data);
    res.end();
  }); 
}).listen(port);

内容的提问来源于stack exchange,提问作者Favorite Right Arm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:21:22