JavaScript:如何将数据添加到 JSON 文件中的数组

JavaScript: how to add data to an array inside JSON file

我正在尝试构建一个简单的 Discord.js 机器人,但我无法将用户输入添加到存储在 json 文件中的数组中。

我想要一个 json 文件来存储机器人可以使用的信息,包括用户也可以添加的引号数组。当前,settings.json 文件如下所示:

{ "token" : , //connection token here

  "prefix" : "|", //the prefix within messages that identifies a command

  "quotes" : [] //array storing a range of quotes
}

然后我可以从数组中提取信息,从当前存储的那些中随机选择一个引用,如下所示:

const config = require("./settings.json");

var quotes = config.quotes;

function randomQuote() {
    return quotes[Math.floor(Math.random() * quotes.length)];
};


if(message.content.toLowerCase() === prefix + "quote") {

    message.channel.send(randomQuote());

}

这一切都按预期工作,但我一辈子都想不出如何让用户向数组添加引号(它会使用类似 |addquote 的命令)。我知道,为了将数据写入 json 文件,我会使用这样的东西:

var fs = require('fs');

let test = JSON.parse(fs.readFileSync("./test.json", "utf8"));

if(message.content.toLowerCase() === 'test') {

    test++;

    fs.writeFile("./test.json", JSON.stringify(test), (err) => {
        if (err) console.error(err)
    });

}

但是我现在想要做什么 - 在现有 json 文件中定位一个特定的数组,该文件包含与数组分开的其他数据,并添加一个新条目而不是覆盖那里的内容 -我很困惑。我到处找了很多,但要么我没有找到我要找的东西,要么我找到了我也看不懂。有人可以帮我吗?

将新项推入数组:

config.quotes.push(newQuote);

Edit:我应该指出,使用 require 以这种方式读取 JSON 文件可能会缓存它,因此您对下次您 require 文件可能不会显示。

文件不能 "edited" 除了文件末尾的串联。要修改该文件之外的文件,需要在内存中进行,然后用内存中的值覆盖现有文件。也就是说,使用这样的文件存储用户输入存在很多问题,其中包括:限制文件的大小;多个进程可能从同一个文件中读取,这些文件可以被其中任何一个覆盖;写入过程中的进程崩溃或错误会使文件无用;等等

您是否研究过真实的数据存储?任何简单的数据库都可以工作,这实际上就是它们的用途。