Discord.js fs.writeFile 未更新正确的 json

问题描述 投票:0回答:1

我正在使用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,而不创建任何新文件?

javascript node.js discord.js node.js-fs
1个回答
0
投票
调用

.

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()

© www.soinside.com 2019 - 2024. All rights reserved.