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

Node.js读取文件返回空响应、write after end及await报错如何解决?

错误根因

  1. 第一个ERR_STREAM_WRITE_AFTER_END报错:fs.promises.readFile是异步方法,不会阻塞主线程执行,你在异步逻辑外直接调用res.end(),会在文件读写、响应写入操作完成前就提前关闭响应流,后续再调用res.write就会触发该错误。
  2. 第二个await 只能在 async 函数中使用报错:await关键字必须在被async关键字修饰的函数内使用,你直接在http.createServer的普通箭头函数回调中使用await不符合语法规则。另外你用await接收异步结果后,再继续用.then/.catch链式调用的写法也是混乱的,await拿到的是Promise的resolve结果,不是Promise对象本身。

解决方案

直接给createServer的回调函数加上async修饰,用try catch处理文件读取的异常,所有异步逻辑执行完成后再调用res.end()即可。

完整修复代码

var http = require("http");
var fs = require("fs").promises;
var server = http.createServer(async (req, res) => {
  try {
    // 读取访问次数文件
    let visitCount = await fs.readFile('AcessedTimes.dat', 'utf-8');
    visitCount = parseInt(visitCount) || 0;
    // 返回响应
    res.write(`This website was accessed ${visitCount} times`);
    // 写入新的访问次数
    await fs.writeFile('AcessedTimes.dat', (visitCount + 1).toString());
  } catch (err) {
    // 文件不存在的情况,初始化访问次数
    if (err.code === 'ENOENT') {
      res.write("This is the first time this website is accessed!");
      await fs.writeFile('AcessedTimes.dat', '1');
    } else {
      // 其他错误打印日志
      console.log(err);
      res.statusCode = 500;
      res.write('Server Error');
    }
  }
  // 所有逻辑执行完成后再关闭响应
  res.end();
})
server.listen(3000, () => {
  console.log('服务已启动,监听端口3000');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:18:04