JavaScript:将请求json字符串附加到现有的json文件

时间:2015-11-10 05:10:10

标签: javascript json node.js express

我有一个简单的快速应用程序,它接受带有一些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的帖子(假设在这种情况下没有嵌套数据)。

编辑:与仅附加到文件不同。需要附加到文件中的对象。

1 个答案:

答案 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];
     }  
  }