在node.js中读写json文件

时间:2014-09-14 09:20:24

标签: javascript json node.js

好吧,我有这个json文件:

{   
    "joe": {
        "name": "joe",
        "lastName": "black"
    },

    "matt": {
        "name": "matt",
        "lastName": "damon"
    }
}

我想添加一个有node.js的人:

{   
    "joe": {
        "name": "joe",
        "lastName": "black"
    },

    "matt": {
        "name": "matt",
        "lastName": "damon"
    },

    "brad": {
        "name": "brad",
        "lastName": "pitt"
    }
}

使用下面的代码我试图读取json文档,解析它,添加人,然后再次写入文件。但是,在写入函数中无法识别已解析的对象(jsonObj)。我知道它与事件循环有关,但我不知道如何解决它。我尝试过使用process.nextTick,但无法使用它。

var jsonObj;

fs.open('files/users.json', 'r+', function opened(err, fd) {
    if (err) {
        throw err;
    }
    var readBuffer = new Buffer(1024),
        bufferOffset = 0,
        readLength = readBuffer.length,
        startRead = 0; 
    fs.read(fd, readBuffer, bufferOffset, readLength, startRead, function read(err, readBytes) {
        if (err) {
            throw err;
        }
        if (readBytes > 0) {
            jsonObj = JSON.parse(readBuffer.slice(0, readBytes).toString());
            jsonObj["brad"] = {};
            jsonObj["brad"].name = "brad";
            jsonObj["brad"].lastName = "pitt";
        **//Until here it works fine and the 'jsonObj' is properly updated**
        }
    });
 });

process.nextTick(function () {
    var writeBuffer, 
        startWrite = 0,
        bufferPosition = 0,
        writeLength;
    fs.open('files/users.json', 'r+', function opened(err, fd) {
        if (err) {
            throw err;
        }
        ***//Below I get the 'jsonObj is undefined' error***
        writeBuffer = new Buffer(JSON.stringify(jsonObj.toString(), null, '/\t/'));
        writeLength = writeBuffer.length;
        fs.write(fd, writeBuffer, bufferPosition, writeLength, startWrite, function wrote(err, written) {
            if (err) {
                throw err;
            }
        });
    });
});

2 个答案:

答案 0 :(得分:7)

在节点中,您可以require json文件:

var fs = require('fs');
var users = require('./names');

users.brad = {
  name: 'brad',
  lastName: 'pitt'
}

var string = JSON.stringify(users,null,'\t');

fs.writeFile('./names.json',string,function(err) {
  if(err) return console.error(err);
  console.log('done');
})

可选的异步版本,无需:

var fs = require('fs');

fs.readFile('./names.json',{encoding: 'utf8'},function(err,data) {
  var users = JSON.parse(data);
   users.brad2 = { name: 'brad', lastName: 'pitt' };
  var string = JSON.stringify(users,null,'\t');

  fs.writeFile('./names.json',string,function(err) {
    if(err) return console.error(err);
    console.log('done');
  })  
})

答案 1 :(得分:2)

简单的提示是:如果你需要使用process.nextTick,那就错了。将该功能留给库程序员! :)

只需将您调用的功能nextTick移至Until here...

即可

nextTick不会等到你读到那个文件(可能需要几个hundret滴答!),它只是等待下一个滴答。这可以使用你调用fs.read的纳秒 - 因为在fs.read之后,nodejs主循环处于空闲状态,直到内核返回有关该文件的某些信息或某人告诉nodejs在下一个tick上做什么。