json文件未使用appendfile正确更新

时间:2018-10-11 03:00:49

标签: node.js json

我正在使用以下代码将数据发布到json文件中:

let productObj= {
      description: req.body.description,
      quality: req.body.quality
    };    

 fs.readFile('products.json', function (err, data) {
     let jsone= JSON.stringify(productObj);
     console.log(jsone);
      fs.appendFile("results.json", jsone, function(err){
        if (err) throw err;

        console.log('The "data to append" was appended to file!');
      });
  });



});

我在控制台中看到POST成功,但是在json文件中,数据被附加到子对象之外。

products.json:
{
"products":[

{
      "description": "Apples",
      "quality": "High",

    },
    {
      "description": "Oranges",
      "quality": "low",

    }
]}

2 个答案:

答案 0 :(得分:1)

appendFile将现有内容与新内容连接在一起。假设以下内容:

  • 旧数据:ABC
  • 新数据:XYZ
  • 最终数据:ABCXYZ

在您的情况下,内容类型为JSON,必须采用某种格式-appendFilecontentType无关,这意味着您必须使用新格式正确格式化/合并现有数据集,并将其保存回文件。

尝试下一个代码

 let productObj= {
   description: req.body.description,
   quality: req.body.quality
 };    

 fs.readFile('products.json', function (err, data) {
   // Convert string (old data) to JSON
   let result = JSON.parse(data);

   // Add new data to result
   result.products.push(productObj);

   // Convert JSON to string
   let jsone= JSON.stringify(result);
   console.log(jsone);
   // Replace all data in the results.json with new ones
   fs.writeFile("results.json", jsone, function(err){
     if (err) throw err;
     console.log('The "data to append" was appended to file!');
   });
 });

答案 1 :(得分:1)

fs.appendFile对文件的json结构一无所知,它将所有文件都视为文本(或二进制)。

有两种解决方案:

每个请求,读取结果文件,将其解析为json,将元素压入数组的末尾,然后使用fs.writeFile替换磁盘上的文件。这种方法使用json,但不是很可靠,因为随着文件的增大,它会变慢,并且如果同时发出多个请求,它会中断。

第二个选项是不使用JSON。而是使用如下所示的基于文本的结构。 这样,您就可以根据需要自由地直接将其附加到磁盘上。如果同时收到请求,这种方法不会中断,并且无论结果文件有多大,它都将保持相同的速度。

Apples High
Oranges Low