更改json对象中的数组条目

时间:2019-01-04 19:54:36

标签: javascript node.js json fs

我已经使用NodeJS的fs.createReadStream()从文件中提取了json,现在发现将数据写回到文件中很困难(已经进行了解析,然后根据需要进行了字符串化处理。)

我正在开发的Discord-Bot删除文本通道,然后“重新创建”它们(具有相同的标题)以清除聊天记录-它动态获取通道ID并将其放入文件中,直到删除通道为止。 但是,文件写入过程最终会出错。

这是我的第一次尝试:

let channels_json = fs.createReadStream()
//let channels_json = fs.readFileSync(`${__dirname}\\..\\json\\channels.json`);                        
let obj = (JSON.parse(channels_json)).channelsToClear;
let i = 0;
obj.forEach(id => {
    i++;
    if(id === originalId){
        obj[i] = channela.id;                                
    }
});
obj += (JSON.parse(channels_json)).infoChannel;
obj += "abc";
json = JSON.stringify(obj);
channels_json.write(json);

这是我的第二个:

let id_to_replace = message.guild.channels.get(channels[channel]).id;
//let channels_json = fs.readFileSync(`${__dirname}\\..\\json\\channels.json`);
let obj;
let channels_json = fs.createReadStream(`${__dirname}\\..\\json\\channels.json`,function(err,data){
    if (err) throw err;
    obj = JSON.parse(data);
    if (obj["channelsToClear"].indexOf(id_to_replace) > -1) {
        obj["channelsToClear"][obj["channelsToClear"].indexOf(id_to_replace)] = channela.id;
        //then replace the json file with new parsed one
        channels_json.writeFile(`${__dirname}\\..\\json\\channels.json`, JSON.stringify(obj), function(){
            console.log("Successfully replaced channels.json contents");
        });
        //channels_json.end();
    }
});

最终结果是使用新的通道ID更新json文件中的'channelsToClear'数组。控制台/节点的输出各不相同,所有这些都与“使用选项对象创建通道”或“ Buffer.write”(均不相关)有关-json文件保持不变。

1 个答案:

答案 0 :(得分:1)

您错误地使用了Streams。您无法通过读取流写回。

对于简单的脚本类型而言,流式传输可能是过大的。流要复杂得多,虽然对于高效率的应用程序来说值得,但对于看起来会相对较快的事物却不值得。

使用fs.readFileSyncfs.writeFileSync来获取和写入数据。

就您实际搜索和替换频道而言,我认为这两种方法都行得通,但是假设只有一次替换,那么第二种方法可能会更好。