如何从json文件读取和写入数据

时间:2019-05-18 18:49:04

标签: node.js json

我想用nodejs编写一个json文件,但是我不知道,因为我是初学者

问题是,当我尝试将数据添加到json文件时,数据没有增加但被覆盖,例如,我有数据“ a”(总数据= 1),然后我尝试添加新数据“ b” ((总数据= 1),因为数据“ a”被数据“ b”覆盖,所以我的数据永远不会增加,仅仅只有1个数据

这是目录/user/userData.json中的json结构

[
 {
  "username": "john",
  "password": "123qwejkl",
  "nama": "john somelastname",
  "no": "0128749726",
  "email": "john@gmail.com",
  "caption": "life is never flat"
 }
]

这是我的nodejs代码

 //const data = fs.readFileSync('./user/userData.json')
 //const jsonData = JSON.parse(data)

 app.post('/user', (req, res)=>{
   const username = req.body.username
   const password = req.body.password
   const name = req.body.nama
   const no = req.body.no
   const email = req.body.email
   const caption = req.body.caption


   const sendData = [{
    username:username,
    password:password,
    name:name,
    no:no,
    email:email,
    caption:caption
   }]


    const sendJSON = JSON.stringify(sendData, null,2)
    fs.writeFile('./user/userData.json', sendJSON)

    res.send(sendData)

 })

我知道我的代码中缺少某些内容,因此请帮助我如何从json文件读取数据,然后将新数据写入json文件

1 个答案:

答案 0 :(得分:1)

为了不覆盖现有数据,您必须从文件系统读取文件,将其解析为JSON,将新元素(用户)压入数组并将结果写入文件系统:

//after you have created sendData object
fs.readFile('./user/userData.json', 'utf8', function (err, data) {
  if (err) throw err;
  output = JSON.parse(data);
  output.push(sendData[0]);
  const sendJSON = JSON.stringify(output, null, 2);
  fs.writeFile('./user/userData.json', sendJSON, function(err){
    if (err) throw err;
    res.send(sendJSON)
  });
});

我可以看到您正在创建某种用户注册系统。请注意,不建议使用文件在Web应用程序中存储数据。可能会导致性能下降,容错能力低以及可能存在的并发数据访问问题(竞争条件)。

根据您的情况,设想以下情况(分步进行):

  1. 用户1使用您的/user端点进行注册
  2. 用户1请求的处理正在等待I / O操作readFile
  3. 与此同时,用户2使用相同的/user端点进行注册
  4. 用户2请求的处理正在等待I / O操作readFile
  5. 用户1请求的处理继续执行(运行回调)并使用writeFile(初始+用户1数据)保存文件
  6. 用户2请求的处理继续执行(运行回调)并使用writeFile(初始+用户2数据)覆盖文件

结果,用户1数据将丢失(包括用户1数据的文件将被覆盖)。

几乎所有数据库都会阻止这种情况的发生。

我建议您研究以下主题:JS异步代码执行,JS回调,数据并发,在node.js中使用数据库(MongoDB是一个很好的开始)。

相关问题