我有一个简单的快速应用程序,它接受带有一些JSON数据的发布请求。我想获取该数据并将其附加到现有的json文件(如果存在)。键值对可能不同。我当前的版本将对象推送到对象数组。理想情况下,我只想添加另一个键/值对:
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的帖子(假设在这种情况下没有嵌套数据)。
编辑:与仅附加到文件不同。需要附加到文件中的对象。
答案 0 :(得分:1)
您可以在for ... in
循环的帮助下简单地遍历post对象,并将其属性添加到文件对象中。请记住,在这种情况下,如果属性键相同,则它们的值将被覆盖。为避免这种情况,您可以在Object.prototype.hasOwnProperty()
的帮助下进行验证。
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);
for(var key in postObj) {
fileObj[key] = postObj[key];
}
var returnjson = JSON.stringify(fileObj);
fs.writeFile(__dirname + '/data/notes.json', returnjson, function(err){
if (err) throw err;
res.send(returnjson);
});
});
});
});
以下是for ... each
声明,如果您不想覆盖属性。将使用_1
,_2
等后缀生成新属性。您还可以使用类似shortid之类的内容来确保属性不会重复,但会更加难看且更少可读的。
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];
}
}