我在做一个基本的“访客簿”功能。
用户可以提交一个小表单(有三个输入:名称,消息和表情)。
我用路由器组件中的req.body获取它。 我使用nodejs,express和BodyParser.
我只想将这些数据存储在JSON中,不想在这里涉及任何数据库。 我遇到了writeFile方法的麻烦,使用的是'fs'模块。 它可以工作,但它将新数据推入JSON文件的单数组之外。
您知道我是否可以推入数组内? 类似于。push方法,但是使用writefile/appendfile/wathever,可以很好地处理json文件。 下面是我的代码:
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”和味精的就是推送的那个。 另外两个是我手工编写的,用于读文件测试。
我希望我提供了所需的所有信息。 不习惯在这里发帖。。。 谢谢你。
如果您从现有文件中读取并使用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)
});
})
但它可能不是最优的,因为随着文件变大,它可能会花费更多的时间。