如何将数据附加到具有 javascript/nodejs 中特定索引的 JSON

How to append data to a JSON with a specific index in javascript/nodejs

我正在执行基本的 'Visitor Book' 功能。
用户可以提交一个小表格(包含三个输入:姓名、消息和表情符号)。
我在我的路由器组件中用 req.body 抓取它。我正在使用带有 express 和 bodyparser 的 nodejs。

我只想将此数据存储在 JSON 中,不希望此处涉及任何数据库。 我遇到了 writeFile 方法的问题,使用 'fs' 模块。 它可以工作,但它会将新数据推送到我的 JSON 文件的单个数组之外。

你知道我是否可以推入阵列内部吗?类似于 .push 方法,但使用 writeFile/appendFile/wathever 与 [=46 配合使用效果很好=] 文件。 这是我的代码:

app.post(路由器):

app.post('/visitorBook', async (req, res) => { 
    let formData = {
        name: req.body.name,
        msg: req.body.msg,
        emoji: req.body.emoji
    }
    try {
        console.log(req.body)
        let data = JSON.stringify(formData, null, 2);

        fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
            flag:'a' // this flag specify 'please append it' over 'please override file'
        }
        }, (err) => {
            console.log('error :', err)
        });


        res.redirect('/contact') 
    } catch (error) {
        console.error('/visitorBook route error : ', error)
    }
})

我的 JSON :

[
    {
        "name": "test1",
        "msg": "test1",
        "emoji": "<i class='fas fa-hippo fa-3x'></i>"
    },
    {
        "name": "test2",
        "msg": "test2",
        "emoji": "<i class='fas fa-hippo fa-3x'></i>"
    }
]


{
  "name": "sd",
  "msg": "sd",
  "emoji": "<i class='fas fa-kiwi-bird fa-3x'></i>"
}

所以最后一个名称和消息中带有“sd”的是推送的。另外2个是我手写的,用于readFile测试。

希望我提供了所有需要的信息。不习惯这里post... 谢谢。

如果您从现有文件中读取并用 JSON.parse 解析它,您将能够在其上实际使用 Array.push。然后你可以将字符串化的结果写回到文件中:

fs.readFile("./views/scripts/dataVisitorBook.json", function (err, data) {
  if (err) throw err;
  let data = JSON.parse(data.toString('utf8'));

  data = JSON.stringify(data, null, 2);

  fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
      flag:'a' // this flag specify 'please append it' over 'please override file'
  }
  }, (err) => {
      console.log('error :', err)
  });
})

它可能不是最佳选择,因为随着文件变大,它可能需要更多时间。

我很欣赏你的简单尝试但是使用一些标准对你来说会更好

Node 有一些标准 JSON 数据库,例如: Simple JSON DB Node JSON DB 另外,你可以试试 SQLite 我还尝试使用一个简单的 JSON 文件作为数据库。我面临着很多工作,我也做到了。所以我的建议是使用一些标准库

除此之外,您还必须获取文件数据将其解析为JSON(解码)进行更改并再次序列化并写入文件(编码)。

[已解决]
感谢 @Divarrek ,我已经完成了它的工作。
所以:

使用 fs.readFileSync 读取文件。
然后,我将这个原始数据存储在一个变量中,同时将其解析为 JSON.
然后,我将其推送到 'jsonBook' 变量中,该变量是 json 文件,临时制作成一个简单的 object-variable.
然后我用 writeFile 写入文件,将数据作为变量 'parsed' 传递,其中包含我的 'jsonBook'

的 JSON.stringified 版本
app.post("/visitorBook", async (req, res) => {
    let formData = {
        name: req.body.name,
        msg: req.body.msg,
        emoji: req.body.emoji,
    };
    try {
        let rawdata = fs.readFileSync("./views/scripts/dataVisitorBook.json");
        var jsonBook = JSON.parse(rawdata);
        let formDataParsed = JSON.stringify(formData, null, 2);
        jsonBook.push(formData);
        let parsed = JSON.stringify(jsonBook, null, 2);
        fs.writeFile("./views/scripts/dataVisitorBook.json", parsed, (err) => {
            if (err) throw err;
            console.log("saved");
        });
        res.redirect("/contact");
    } catch (error) {
        console.error("/visitorBook route error : ", error);
    }
});

希望我说的很清楚。可能是我解释有误,我尽力了。