简体   繁体   中英

Node Js : How to read and update json file

Hello I am a new coder but I am having troubles trying to add a new user (req) to a json file of users I have for a fake bank. I'm more confused on the type of object these are and how to access them from data. I would appreciate any words of advice. Currently I can only add the new account in, but it replaces the other users in the file. So now I'm trying to add the old users and the new users before I import but I am unsure how. My main area on confusion is how to access and manipulate the "data" from fs.readfile

app.post('/Account', (req, res,) => 
 {
    var queryParameter = req.query;
    console.log(queryParameter.pin);
    console.log(queryParameter.firstName);
    console.log(queryParameter.lastName);
    console.log(queryParameter.Balance);
    console.log(queryParameter.email);
    const tempAccount = 
    { 
        pin: Number(queryParameter.pin),
        firstName: queryParameter.firstName.toString(), 
        lastName: queryParameter.lastName.toString(),
        Balance: Number(queryParameter.Balance),
        email: queryParameter.email.toString() 
    };

    let content = []; 
    var data2 = tempAccount;//JSON.stringify(tempAccount, null, 2);*/
    const fileName = "Routes/Users.json";
    let content2 = [];
    
    fs.readFile(fileName, 'utf8', function(err, data)
    {
      data = JSON.parse(data);
      content2.push(JSON.stringify(data));
    });
        
    content.push(content2);
    content.push(data2);

    fs.writeFile(fileName, content, (err) => 
    {
      if (err) throw err;
    console.log('Data written to file');
    })
    res.send(data);
    
});

Here is the json file: 
{
    "user": [
     {
      "pin": "1234",
      "firstName": "Peter",
      "lastName": "Parker",
      "balance": "50",
      "email": "spider@avenger.com"
     },
     {
      "pin": "5678",
      "firstName": "Steve",
      "lastName": "Rogers",
      "balance": "50",
      "email": "captain@avenger.com"
     },
     {
      "pin": "4321",
      "firstName": "Tony",
      "lastName": "Stark",
      "balance": "1000",
      "email": "iron@avenger.com"
     }
    ]
   }

This is the key problem:

let content2 = [];

fs.readFile(fileName, 'utf8', function(err, data)
{
  data = JSON.parse(data);
  content2.push(JSON.stringify(data));
});
    
content.push(content2);
content.push(data2);

JSON is useful as an interchangeable data format, but is not something you want to try to manipulate in your application. As soon as you use JSON.stringify() , your data becomes a string . The only way to manipulate it as regular data again is to use JSON.parse() .

So, in your code, you're parsing data, but turning right around and stringifying it as JSON again, and then trying to push it to content2 . Assuming there weren't any asynchronous issues (there are, but more on that later), content2 would just be an array containing a single string.

Two things need to change. First, you need to wait for the data from the file to be loaded before you do anything else. As @jarmod mentions in the comments, you can do this by using a synchronous form of readFile , but it's better to do this async so as not to freeze up your application while we wait for the file.

Untested code, but try something like this:

import * as fs from 'fs/promises';

const dataFile = 'data.json';

function async loadData() {
  return JSON.parse(
    await fs.readFile(dataFile)
  );
}

function async saveData(data) {
  await fs.writeFile(
    dataFile,
    JSON.stringify(data)
  );
}

Now, when you want to use these functions, it's a bit easier:

app.post('/Account', async (req, res, next) => {
  const data = await loadData();
  
  // ... do other things here ...
  // For example:
  // data.user.push({ firstName: 'Brad' });
  
  await saveData(data);
});

Note that I changed this Express callback/handler to be async .

In the future, if you really want to use a local file-based database, check out SQLite3. It's very fast and extremely reliable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM