我需要在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。怎么了?如何删除其中一个保存的网址?
答案 0 :(得分:1)
更新2
我的第一次尝试忽略了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
方法中,并将flag
键设置为'a'。这告诉writeFile
以追加模式编写。文档here和here。
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;
});
答案 1 :(得分:0)
您正在使用回调函数,因此不能那样使用
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;
});
}
});
这应该可以,但是似乎没有道理。
看看异步函数,回调和Promise。特别是回调的工作方式,您的代码必须在每个函数中执行