我正在使用discord.js 编写一个机器人。我使用一个名为
data
的 json 来保存可以通过斜杠命令更改的信息。但是,使用 fs.writeFile
不会修改目标 json。
我的文件结构是
node_modules
src
- index.js
- data.json
.env
package.lock
package.json
这就是项目启动时
data.json
的样子
{
"something": "fdafda"
}
这就是
index.js
的样子:
require('dotenv').config();
const { Client, IntentsBitField } = require('discord.js');
const fs = require('fs');
const dataFileName = './data.json';
const data = require(dataFileName);
const client = new Client({
intents: [
IntentsBitField.Flags.Guilds,
IntentsBitField.Flags.GuildMembers,
IntentsBitField.Flags.GuildMessages,
IntentsBitField.Flags.MessageContent,
],
});
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);
这是机器人初始化时在终端中记录的内容:
KTANE FAQ#1840 is online.
{ something: 'fdafda' }
{
"something": "fdafda",
"modCreationId": "new value"
}
文件被正确读取,因为
something
填充在数据变量中,并且 JSON.stringify
console.log 显示了我想要 data.json
具有的内容,但文件仍然只显示
{
"something": "fdafda"
}
当我回顾文件结构时,我意识到在
data.json
文件夹之外创建了一个新的 src
文件。有了正确的信息。
node_modules
src
- index.js
- data.json
data.json
.env
package.lock
package.json
我认为删除
src
文件夹内的 json 可以解决问题,但是如果我这样做,则会出现 MODULE_NOT_FOUND
错误。我需要做什么才能定位 src
文件夹中的 json,而不创建任何新文件?
.
和
require()
时,
writeFile()
的含义不同:
require()
的路径是相对于当前文件src/index.js
的,所以.
表示src
。writeFile()
的路径是相对于当前工作目录的,因此.
是项目的根目录。__dirname
,将其设置为包含当前文件的目录的绝对路径,并使用path.join()
使writeFile()
相对于index.js
:
const path = require('path');
// ...
fs.writeFile(path.join(__dirname, dataFileName), /* more arguments */);
或者您可以在拨打
../
时在 dataFileName
之前添加 writeFile()
。