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

Discord.js/Node.js FS:如何在同一会话中重新加载文件?

解决抽奖系统中tickets.json重置后读取旧内容的问题

看起来你遇到的问题主要来自两个常见的Node.js陷阱:异步文件写入的时序问题和require加载JSON的缓存机制。下面是针对这两个问题的常规修复方案,完全保留你用JSON文件存储的需求:

1. 确保文件写入完成后再进行后续操作

fs.writeFile是异步方法——它会在后台完成文件写入,而你的代码会继续执行后面的lottery = []。如果在写入完成前就尝试读取文件,拿到的自然还是旧内容。

修复方案:使用异步/等待(Async/Await)或回调确保写入完成

推荐用fs.promises.writeFile配合async/await,让代码逻辑更清晰:

const fs = require('fs').promises; // 引入promise版的fs模块
var lottery = [];

async function reset() {
  try {
    // 等待文件写入完成
    await fs.writeFile("./tickets.json", "{}");
    lottery = [];
    console.log("抽奖数据已成功重置");
  } catch (err) {
    console.error("重置时出错:", err);
  }
}

如果你更习惯回调写法,也可以把后续依赖文件更新的操作放到fs.writeFile的回调里:

const fs = require('fs');
var lottery = [];

function reset() {
  fs.writeFile("./tickets.json", "{}", (err) => {
    if (err) {
      console.error("重置时出错:", err);
      return;
    }
    // 只有写入成功后才重置数组和执行后续操作
    lottery = [];
    console.log("抽奖数据已成功重置");
    // 这里可以调用需要读取新文件内容的函数
  });
}

2. 避免require加载JSON的缓存问题

如果你的代码是用require('./tickets.json')来读取文件内容,那问题可能出在Node.js的模块缓存机制上:Node.js会缓存通过require加载的模块(包括JSON文件),即使你后续修改了文件内容,再次调用require返回的还是缓存的旧数据。

修复方案:改用fs读取文件,或手动清除缓存

方案A:用fs.readFile/fs.promises.readFile读取文件

每次读取都直接从磁盘获取最新内容,完全绕过缓存:

async function getTickets() {
  try {
    const fileContent = await fs.promises.readFile("./tickets.json", "utf8");
    return JSON.parse(fileContent);
  } catch (err) {
    console.error("读取抽奖数据出错:", err);
    return {}; // 出错时返回空对象
  }
}

方案B:手动清除require缓存(不推荐,但如果必须用require可以用)

在每次读取前删除对应模块的缓存:

function getTickets() {
  // 清除tickets.json的模块缓存
  delete require.cache[require.resolve('./tickets.json')];
  // 重新加载文件
  return require('./tickets.json');
}

总结

优先结合异步写入确保完成和用fs读取文件的方案,这是最可靠且符合Node.js最佳实践的方式。这样就能保证在重置后,后续读取到的都是tickets.json的最新状态了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:32:01