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

Posted

技术标签:

【中文标题】NodeJS 异步 JSON 解析导致 Buffer.toString() 失败【英文标题】:NodeJS Async JSON parsing causing Buffer.toString() failure 【发布时间】:2017-09-15 11:54:24 【问题描述】:

我正在尝试在 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 造成的。

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

【问题讨论】:

您能分享一下您是如何使用JSONstream 模块的吗? 【参考方案1】:

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

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

https://www.npmjs.com/package/JSONStream https://www.npmjs.com/package/stream-json https://www.npmjs.com/package/json-stream https://www.npmjs.com/package/json-parse-stream https://www.npmjs.com/package/json-streams https://www.npmjs.com/package/jsonparse

JSONStream 示例:

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

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

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

【讨论】:

实际上只是偶然发现了其中的几个库。在 NodeJS 社区解决这个问题之前,我会使用一个。尽管如此,还是感谢您的回复。 你知道为什么JSONStream没有超出缓冲区吗?它会在数据进入时尝试解析它吗?【参考方案2】:

尝试使用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));
);

【讨论】:

这仍然会导致同样的问题,当Buffer.concat(data).toString() 执行时,缓冲区中有 >256Mb

以上是关于NodeJS 异步 JSON 解析导致 Buffer.toString() 失败的主要内容,如果未能解决你的问题,请参考以下文章

Lambda中的NodeJS异步未运行所有条目

深入解析Javascript异步编程

使用 Express 框架在 Nodejs 中解析 JSON 请求 [重复]

Nodejs - Express JSON 解析器无法响应

在Nodejs中解析由新行分隔的json数据

在 NodeJS 中解析 JSON 对象数组