JavaScript:将post请求json字符串附加到现有json文件
我有一个简单的express应用程序,它接受带有一些JSON数据的post请求。我希望获取该数据并将其附加到现有的json文件(如果存在的话)。键值对可能不同。我的当前版本将对象推送到对象数组中。理想情况下,我只想添加另一个键/值对:JavaScript:将post请求json字符串附加到现有json文件,javascript,json,node.js,express,Javascript,Json,Node.js,Express,我有一个简单的express应用程序,它接受带有一些JSON数据的post请求。我希望获取该数据并将其附加到现有的json文件(如果存在的话)。键值对可能不同。我的当前版本将对象推送到对象数组中。理想情况下,我只想添加另一个键/值对: app.post('/notes', function(req, res){ var body = ""; req.on('data', function(chunk){ body += chunk; }); req.on('end', f
app.post('/notes', function(req, res){
var body = "";
req.on('data', function(chunk){
body += chunk;
});
req.on('end', function(){
fs.readFile(__dirname + '/data/notes.json', function(err, data){
if (err) throw err;
console.log(body);
var fileObj = JSON.parse(data.toString());
var postObj = JSON.parse(body);
fileObj.notes.push(postObj);
var returnjson = JSON.stringify(fileObj);
fs.writeFile(__dirname + '/data/notes.json', returnjson, function(err){
if (err) throw err;
res.send(returnjson);
});
});
});
});
notes.json中可能包含的内容示例:
{"note": "Dear Diary: The authorities have removed the black pants from the couch"}
这是可行的,但我在添加帖子中的json时遇到了麻烦(假设本例中没有嵌套数据)
编辑:与仅附加到文件不同。需要附加到文件中的对象。您只需借助循环遍历post对象,并将其属性添加到文件对象中即可。请记住,在这种情况下,如果属性键相同,它们的值将被覆盖。为了避免这种情况,您可以在的帮助下进行验证 这里是关于。。。每个语句,如果不想覆盖属性。新属性将使用以下后缀生成:
\u 1
、\u 2
等。您也可以使用类似的方法来确保属性不会重复,但这样会更难看,可读性较差
for(var key in postObj) {
if(fileObj.hasOwnProperty(key)) {
while(true) {
i++;
newKey = key + '_' + i;
if(fileObj.hasOwnProperty(newKey) == false) {
fileObj[newKey] = postObj[key];
break;
}
}
} else {
fileObj[key] = postObj[key];
}
}
当您说append时,您是指向文件中添加额外的JSON对象行,还是指将接收到的JSON对象的键/值对与文件中的键/值对合并?add additional:因此可能会有一个{“note2”:“这是一个新的注释”}POST请求中要附加到现有notes.json文件的键值对。的可能重复项我不这么认为。它必须添加到文件中的JSON对象中,而不是在结束括号之后。每次要更新文件时,都要读取、解析、附加新JSON、序列化并重写文件。这是一大笔开销。您是否可以在每次post请求时将
JSON.stringify(postObj)+',
附加到文件中,然后在读取日志文件时对其进行一些处理?(处理过程可能像JSON.parse('['+fileData+']')一样简单。
。我认为这很接近。但是如果postObj和fileObj中的键相同,postObj将覆盖原始的。我想知道是否有办法添加唯一标识符。
for(var key in postObj) {
if(fileObj.hasOwnProperty(key)) {
while(true) {
i++;
newKey = key + '_' + i;
if(fileObj.hasOwnProperty(newKey) == false) {
fileObj[newKey] = postObj[key];
break;
}
}
} else {
fileObj[key] = postObj[key];
}
}