我现在正在开发一个Discord机器人,该机器人从JSON文件中读取响应。基本格式如下:
"matt":
{
"insults" : ["test 1",
"test 2",
"test 3",
"test 4"
]
},
我当前正在使用一个函数,该函数允许用户使用!addInsult
命令,后跟一个字符串,该字符串随后将附加到现有数组上。
我想要的工作流程如下:
用户键入以下内容:!addInsult test 5
。然后,这会将insults
下的matt
的JSON对象修改为以下内容:
"matt":
{
"insults" : ["test 1",
"test 2",
"test 3",
"test 4",
"test 5"
]
},
这样做可以让我的朋友将数据添加到我的机器人中,而无需每次我们想要新内容时都手动编辑JSON。
解决这个问题的最佳方法是什么?我已经研究了这种叫做“推”的东西,但是我真的不明白它是如何工作的。
这是我到目前为止所拥有的。我认为我朝着正确的方向前进,但不确定:
在脚本的开头建立了以下内容:
// contains the insults
var insults = require('./insults.json');
// get the insults from the json file specific to user
var insultsString = JSON.stringify(insults);
var json = JSON.parse(insultsString);
这是将要追加的函数:
// command that allows users to add to the pool of insults
function addInsultCommand(args, receivedMessage)
{
// create an object that contains the information for the json file
json["bot"].push(["test"]);
receivedMessage.channel.send(json.matt.insults[0]);
}
答案 0 :(得分:0)
所以这里有一个误解; JS不写文件。
您正在使用webpack,这使您可以使用webpack加载器{。{json}} {.1},但这仅在使用dev服务器时有效。分发代码时,此方法将不起作用,因为.json将被编码到您的输出包中。
.js无法为您(本地除外)编写文件,因此您需要做两件事:
1)从Web服务器上下载.json,而无需使用webpack加载器。
2)修改内存中的JSON数据
3)将JSON数据上传到Web服务器,以便它为您编写文件。
除此之外,我无法遵循您的示例代码。您引用了require
,但看不到它的定义位置。这是某种不和谐的整合吗?您可能需要重新陈述您的问题,并使用可重现的测试代码来最小化该问题的证据。
答案 1 :(得分:0)
JSON.stringify会将javascript对象转换为JSON对象。 JSON.parse将执行相反的操作(将JSON对象转换为Javascript对象)。假设insults.json是json对象,则无需将其转换为字符串。您可以执行JSON.parse(insults)将其转换为javascript对象。
我不确定您打算对addInsultCommand中的args变量做什么,但是我现在暂时忽略,并在下面提供一些步骤。
1)将JSON对象(侮辱)变成JS对象
2)创建一个函数,该函数接受一个JS对象和一个receiveMessage(要添加的侮辱),并将其分配给JS对象中的正确位置。
3)将JS对象转换为JSON(使用JSON.stringify),并将insults.json的内容替换为更新后的值。