Javascript 如何使用节点Js中的文件系统在文件中重写JSON对象

Javascript 如何使用节点Js中的文件系统在文件中重写JSON对象,javascript,node.js,fs,Javascript,Node.js,Fs,我在NodeJS中遇到了使用fs的读写操作 我的场景是这样的,我有一个文件,其中包含如下数据: [ { "Pref":"Freedom", "ID":"5545" }, { "Pref":"Growth", "ID":"8946545" } ] 我必须使用节点js替换ID为5545的元素的Pref 我该怎么做呢。谢谢您有一些数据: const data = [ { "Pref":"Freedom", "ID":"5545" }, {

我在NodeJS中遇到了使用fs的读写操作

我的场景是这样的,我有一个文件,其中包含如下数据:

[
{
    "Pref":"Freedom",
    "ID":"5545"
},
{
    "Pref":"Growth",
    "ID":"8946545"
}
]
我必须使用节点js替换ID为5545的元素的Pref

我该怎么做呢。谢谢

您有一些数据:

const data = [
  {
    "Pref":"Freedom",
    "ID":"5545"
  },
  {
    "Pref":"Growth",
    "ID":"8946545"
  }
]
首先,我们需要找到要更改的元素(如果有多个ID为5545的项目,请使用
[0]
仅选择第一个:

const objectToChange = data.filter(item => item.ID === "5545")[0]
然后改变它

objectToChange['Pref'] = "Liberty"
我们可以看到数据对象中反映的变化:

console.log(data)

//  [{
//    ID: "5545",
//    Pref: "Liberty"
//  },{
//    ID: "8946545",
//    Pref: "Growth"
//  }]

1-加载文件:
let json=json.parse(fs.readFileSync('file.json','utf-8');

2-更新内容:

json = json.map(el => {
  if(el.ID === "5545") {
    el.Pref = "TEST";
  }
  return el;
});
3-可能再保存一次


fs.writeFileSync('test.json',json.stringify(json),'utf-8');

要执行您想要的操作,您需要:

  • 使用
    fs.readFile()
  • 使用
    JSON.parse()解析JSON
  • 在数组中找到正确的对象
  • 更改对象
  • 使用
    JSON.stringify()
  • 使用
    fs.writeFile()写入文件
  • 但这并不像看上去那么简单,因为你必须:

    • 将锁定添加到写入,这样您就不会同时执行两次写入
    • 将锁定添加到读取,以便在写入过程中从不读取
    • 处理不正确的JSON
    • 处理无法序列化的对象的情况
    • 避免在事件循环的第一个勾号之外的任何地方阻塞操作(名称中带有“Sync”的操作)

    考虑所有这些,您应该考虑使用数据库来存储任何更改的数据。像Mongo、PASGRESs或ReDIS这样的数据库需要作为独立的应用程序运行在相同或不同的服务器上。一些嵌入式数据库(如SQLite)不需要独立的进程,并且可以直接在应用程序中运行。


    这并不是说不可能写入JSON文件,然后根据需要读取这些文件,而是要同步数据访问而不意外阻塞过程中的事件循环,所需的工作量要比只按预期使用任何数据库困难得多。

    通过尝试真正编写内容和当被卡住时,在此处询问特定问题,您可以使用节点fs API
    readFile
    readFileSync
    ()读取文件,进行更改,然后重写文件。非常好的解释@rsp!