NodeJS异步JSON解析导致Buffer.toString()失败

时间:2017-04-19 10:06:26

标签: json node.js

我正在尝试在NodeJS中解析一个相当大的JSON文件(~500Mb)。我的实现基于this answer中给出的异步方法:

var fileStream = require('fs');
var jsonObj;

fileStream.readFile('./data/exporttest2.json', fileCallback);

function fileCallback (err, data) {
    return err ? (console.log(err), !1):(jsonObj = JSON.parse(data));
    //Process JSON data here
}

这一切都很好,但我收到以下错误消息:

buffer.js:495
    throw new Error('"toString()" failed');
    ^

Error: "toString()" failed
    at Buffer.toString (buffer.js:495:11)
    at Object.parse (native)
    at fileCallback (C:\Users\1700675\Research\Experiments\NodeJS\rf_EU.js:49:18)
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:445:3)

我从this answer了解到这是由V8引擎中最大缓冲区长度设置为256Mb引起的。

我的问题是,是否有一种方法可以在不超过缓冲区长度256Mb的块中异步读取我的JSON文件,而无需手动将我的JSON数据传播到多个文件中? < / p>

2 个答案:

答案 0 :(得分:2)

  

有没有办法可以在不超过缓冲区长度256Mb的块中异步读取我的JSON文件,而无需手动将我的JSON数据传播到多个文件中?

这是一个常见问题,有几个模块可以帮助你:

JSONStream示例:

const JSONStream = require('JSONStream');
const fs = require('fs');

fs.createReadStrem('./data/exporttest2.json')
  .pipe(JSONStream.parse('...'))...

有关所有参数的详细信息,请参阅文档。

答案 1 :(得分:-1)

尝试使用streams

let fs = require("fs");

let s = fs.createReadStream('./a.json');
let data = [];
s.on('data', function (chunk) {
    data.push(chunk);
}).on('end', function () {
    let json = Buffer.concat(data).toString();
    console.log(JSON.parse(json));
});