【问题标题】:Node Js : How to read and update json fileNode Js:如何读取和更新 json 文件
【发布时间】:2022-01-26 18:35:45
【问题描述】:

您好,我是一名新编码员,但在尝试将新用户 (req) 添加到我为假银行拥有的用户的 json 文件中时遇到了麻烦。我对这些对象的类型以及如何从数据中访问它们感到更加困惑。我将不胜感激任何建议。目前我只能添加新帐户,但它会替换文件中的其他用户。所以现在我尝试在导入之前添加旧用户和新用户,但我不确定如何。我的主要困惑是如何从 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"
     }
    ]
   }

【问题讨论】:

  • 建议你暂时使用fs.readFileSync,但也要学习异步JavaScript。
  • fs.readFile() 是异步且非阻塞的。调用它开始执行,然后立即进入其回调之外的行。然后在函数中的其他代码顶级代码执行后的某个时间调用回调。因此,您尝试在收到其内容之前使用content2。

标签: javascript node.js


【解决方案1】:

这是关键问题:

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 作为一种可互换的数据格式很有用,但不是您想在应用程序中操作的东西。一旦你使用JSON.stringify(),你的数据就会变成一个字符串。再次将其作为常规数据进行操作的唯一方法是使用JSON.parse()。

因此,在您的代码中,您正在解析数据,但转而将其再次字符串化为 JSON,然后尝试将其推送到 content2。假设没有任何异步问题(有,但稍后会详细介绍),content2 将只是一个包含单个字符串的数组。

有两件事需要改变。首先,您需要等待文件中的数据被加载,然后再执行其他任何操作。正如 @jarmod 在 cmets 中提到的,您可以使用 readFile 的同步形式来执行此操作,但最好异步执行此操作,以免在我们等待文件时冻结您的应用程序。

未经测试的代码,但试试这样的:

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)
  );
}

现在,当你想使用这些功能时,就简单了一点:

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);
});

请注意,我将此 Express 回调/处理程序更改为 async。

将来,如果您真的想使用本地基于文件的数据库,请查看 SQLite3。它非常快速且极其可靠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2016-03-14
    相关资源
    最近更新 更多