我正在使用以下代码将数据发布到json文件中:
let productObj= {
description: req.body.description,
quality: req.body.quality
};
fs.readFile('products.json', function (err, data) {
let jsone= JSON.stringify(productObj);
console.log(jsone);
fs.appendFile("results.json", jsone, function(err){
if (err) throw err;
console.log('The "data to append" was appended to file!');
});
});
});
我在控制台中看到POST成功,但是在json文件中,数据被附加到子对象之外。
products.json:
{
"products":[
{
"description": "Apples",
"quality": "High",
},
{
"description": "Oranges",
"quality": "low",
}
]}
答案 0 :(得分:1)
appendFile
将现有内容与新内容连接在一起。假设以下内容:
ABC
XYZ
ABCXYZ
在您的情况下,内容类型为JSON,必须采用某种格式-appendFile
与contentType
无关,这意味着您必须使用新格式正确格式化/合并现有数据集,并将其保存回文件。
尝试下一个代码
let productObj= {
description: req.body.description,
quality: req.body.quality
};
fs.readFile('products.json', function (err, data) {
// Convert string (old data) to JSON
let result = JSON.parse(data);
// Add new data to result
result.products.push(productObj);
// Convert JSON to string
let jsone= JSON.stringify(result);
console.log(jsone);
// Replace all data in the results.json with new ones
fs.writeFile("results.json", jsone, function(err){
if (err) throw err;
console.log('The "data to append" was appended to file!');
});
});
答案 1 :(得分:1)
fs.appendFile
对文件的json结构一无所知,它将所有文件都视为文本(或二进制)。
有两种解决方案:
每个请求,读取结果文件,将其解析为json,将元素压入数组的末尾,然后使用fs.writeFile
替换磁盘上的文件。这种方法使用json,但不是很可靠,因为随着文件的增大,它会变慢,并且如果同时发出多个请求,它会中断。
第二个选项是不使用JSON。而是使用如下所示的基于文本的结构。 这样,您就可以根据需要自由地直接将其附加到磁盘上。如果同时收到请求,这种方法不会中断,并且无论结果文件有多大,它都将保持相同的速度。
Apples High
Oranges Low