如何使用FS编辑文件的一部分?

时间:2019-08-09 19:55:04

标签: javascript fs

我正在尝试使用fs在另一个文件中重写一个变量,而不更改/删除其他变量,但是我不知道该怎么做。

我想编辑一个名为data.json的文件,其中有很多变量。像这样:

"b": {
    "ra": 100,
    "error": 0
}
"a": {
    "ra": 100,
    "error": 0
}

如何在不删除A的情况下编辑B?

现在我有以下代码:

var datajson = fs.readFileSync(`data.json`);
var data = JSON.parse(datajson);

startdata = {
    b: {
        ra: 0,
        error: 1
    }
}

fs.writeFile("./data.json", JSON.stringify (startdata, null, 4), err => {
    if (err) throw err;
})

此代码的问题是它从data.json中删除了每隔一行代码,而我最终得到了这一点:

"b": {
    "ra": 0,
    "error": 1
}

3 个答案:

答案 0 :(得分:0)

fs.writeFile将重写整个文件。

对此我们可以做些什么,我们还必须编写现有内容。您可以使用Object.assign(或对象传播)来合并对象:

var newdata = Object.assign({},data,startdata)

上面的代码行将...

  • 创建一个新对象
  • datastartdata的属性分配给该对象(startdata的属性将覆盖data的属性)
  • 将结果保存到newdata

因此,您的代码应如下所示:

var datajson = fs.readFileSync(`data.json`);
var data = JSON.parse(datajson);

startdata = {
    b: {
        ra: 0,
        error: 1
    }
}

var newdata = Object.assign({},data,startdata)

fs.writeFile("./data.json", JSON.stringify (newdata, null, 4), err => {
    if (err) throw err;
})

答案 1 :(得分:0)

您可以尝试使用spread运算符

startdata = {
    ...data,
    b: {
        ra: 0,
        error: 1
    }
}

MDN上扩展运算符语法。

请确保还验证您的JSON:
https://jsonformatter.curiousconcept.com/

答案 2 :(得分:0)

nodejs fs具有createWriteStream方法。

选项,可用于设置文件的开始指针/偏移量。 编写新的缓冲区,然后关闭流,就可以了。

数学只是为了估计开始位置-这是读者的练习;)

在您的示例中,它应该只是

// untested!
let index = fs.readFileSync('data.json') // "b" ...
            .indexOf("b") // 2
if(index == -1) throw;
const ws = fs.createWriteStream(`data.json`, {start: index, flags: "rs+"});
ws.on('error', errHandler(err));
ws.on('close', function continueFromHere(){})
ws./*write*/end(JSON.stringify (startdata, null, 4), (err)=>notGuaranteedErrHandler(err));