Discord.js中fs.writeFile未正确更新目标data.json文件求助
解决Discord.js机器人写入data.json路径错误的问题
问题根源
你碰到的核心问题是Node.js文件操作的路径解析规则:fs.writeFile用的相对路径是基于你启动机器人时的工作目录(也就是项目根目录),而不是index.js所在的src文件夹。
- 用
require('./data.json')时,Node.js会相对于当前脚本文件(src/index.js)查找,所以能正确加载src/data.json; - 但
fs.writeFile('./data.json')会在项目根目录生成新文件,根本没去修改src里的原文件。
解决方案
用Node.js内置的__dirname变量或path模块构建绝对路径,让读写操作精准指向src/data.json。
推荐方案:用__dirname拼接路径
__dirname是Node.js自带的全局变量,代表当前脚本所在目录的绝对路径,修改代码如下:
require('dotenv').config(); const { Client, IntentsBitField } = require('discord.js'); const fs = require('fs'); const path = require('path'); // 拼接出src目录下data.json的绝对路径 const dataFileName = path.join(__dirname, 'data.json'); const data = require(dataFileName); // ...客户端初始化代码 client.on('ready', (c) => { console.log(`✅ ${c.user.tag} is online.`); console.log(data); data.modCreationId = "new value"; fs.writeFile(dataFileName, JSON.stringify(data, null, 2), (err) => { if (err) return console.log(err); console.log(JSON.stringify(data, null, 2)); }); }); client.login(process.env.DISCORD_TOKEN);
备选方案:直接指定相对根目录的路径
如果你确定项目结构不会变动,也可以直接写./src/data.json,但这种方式灵活性差,项目移动后容易出错:
const dataFileName = './src/data.json';
额外提示
- 如果有多处修改
data.json的逻辑,建议每次写入后重新读取文件,避免内存数据和文件内容不一致; - 可以改用
fs.promises.writeFile的Promise异步写法,让代码更贴合现代JS风格。
内容的提问来源于stack exchange,提问作者Kovu Bentley
相关产品推荐
相关产品推荐

