繁体   English   中英

在node.js中读写json文件

[英]read and write a json file in 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;
            }
        });
    });
});

在节点中,您可以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');
  })  
})

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

只需将您使用nextTick调用的函数移动Until here...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM