Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数组写入JSON文件_Javascript_Node.js_Discord.js - Fatal编程技术网

Javascript 将数组写入JSON文件

Javascript 将数组写入JSON文件,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,我需要在json文件中存储一个与数字关联的URL数组。 到目前为止,我得到的是: json[message.guild.id] = { songs: [] }; fs.readFile("./settings.json", "utf8", (err, data) => { if (err) { throw err; } else { json[message.guild.id] = JSON.parse(data); } }); json[message.g

我需要在json文件中存储一个与数字关联的URL数组。 到目前为止,我得到的是:

json[message.guild.id] = {
  songs: []
};
fs.readFile("./settings.json", "utf8", (err, data) => {
  if (err) {
    throw err;
  } else {
    json[message.guild.id] = JSON.parse(data);
  }
});
json[message.guild.id].songs.push(url); // adding a new URL
fs.writeFile("./settings.json", JSON.stringify(json, null, 4), err => {
  if (err) throw err;
});

这确实有效,但如果我试图保存下一个URL,它只会覆盖现有的URL。有什么问题?我如何删除保存的URL之一?

您使用的是回调函数,因此不能这样使用它

json[message.guild.id] = {
  songs: []
};
fs.readFile("./settings.json", "utf8", (err, data) => {
  if (err) {
    throw err;
  } else {
    json[message.guild.id] = JSON.parse(data);
    json[message.guild.id].songs.push(url); // adding a new URL
    fs.writeFile("./settings.json", JSON.stringify(json, null, 4), err => {
      if (err) throw err;
    });
  }
});
这应该是可行的,但似乎没有意义


看看异步函数、回调和承诺。特别是回调如何工作,您的代码必须在每个函数内部执行

我的第一次尝试忽略了JSON问题,这是我留给后人的,但您不应该这样做,因为它会在这里创建错误的JSON对象

然而,我很好奇你是如何开始这个脚本的。如果它与您提供的块相同,您可能每次都会重置
message.guild.id
的数组。你可以试着用这样的方法来预防它:

if(!json.hasOwnProperty[message.guild.id]){
    json[message.guild.id] = {};
} else if (!json[message.guild.id].hasOwnProperty('songs')){
    json[message.guild.id].songs = [];
}
同样,这只是一个假设,因为我们没有看到实现

从粘贴更新固定打字错误

您需要向
writeFile
方法添加一个options对象,并将
标志
键设置为“a”。这告诉
writeFile
以追加模式写入。文件和文件


您正在
写入文件,这就是原因。您要做的是将
附加到它。看看这个:它的可能复制品并不清楚你在保存什么。如果您展示了
settings.json
示例:
{“498208636234104846”:{“songs”:[“https://www.youtube.com/watch?v=S81bLqpstUE"         ]     } }
OP提到
如果我试图保存下一个URL,它只会覆盖现有的一个
——这意味着它正在删除现有内容。因此,他不应该使用
appendFile
函数而不是
writeFile
?是的,他应该使用@joe answer声明的标志。然而,问题是回调函数有问题,附加到JSON文件如何工作?这不会产生格式错误的JSON吗?你完全正确。我的重点是更正覆盖而不是数据格式。@Joe我仍然无法理解,我希望此文件的结构如下:
{“498208636234104846”:{“songs”:https://www.youtube.com/watch?v=S81bLqpstUE",             "https://www.youtube.com/watch?v=5lJhX6PGmMo"         ]     },     “457965143612194829”:{“歌曲”:https://www.youtube.com/watch?v=2YeDOa2XoeF",             "https://www.youtube.com/watch?v=cPOvNhET5gI“]}
当用户执行命令为给定的帮会ID添加歌曲URL时,此脚本将启动。希望您能理解我的意思。
json[message.guild.id] = {
  songs: []
};
fs.readFile("./settings.json", (err, data) => {
  if (err) {
    throw err;
  } else {
    json[message.guild.id] = JSON.parse(data);
  }
});
json[message.guild.id].songs.push(url); // adding a new URL
fs.writeFile("./settings.json", {encoding:"utf8", flag:'a'}, JSON.stringify(json, null, 4), err => {
  if (err) throw err;
});