2015-09-06 6 views
5

У меня есть большой объект javascript, который я хочу преобразовать в JSON и записать в файл. Я думал, что я мог бы сделать это, используя потоки, как такКак использовать потоки в JSON, строят большие вложенные объекты в Node.js?

var fs = require('fs'); 
    var JSONStream = require('JSONStream'); 
    var st = JSONStream.stringifyObject() 
      .pipe(fs.createWriteStream('./output_file.js')) 

    st.write(large_object); 

Когда я пытаюсь это я получаю сообщение об ошибке:

stream.js:94 
    throw er; // Unhandled stream error in pipe. 
     ^
TypeError: Invalid non-string/buffer chunk 
    at validChunk (_stream_writable.js:153:14) 
    at WriteStream.Writable.write (_stream_writable.js:182:12) 

Таким образом, очевидно, я не могу просто написать объект в этом stringifyObject. Я не уверен, что следующий шаг. Мне нужно преобразовать объект в буфер? Запустите объект через некоторый конверсионный поток и проведите его до strinigfyObject

ответ

2

JSONStream не работает, но поскольку ваш большой объект уже загружен в память, нет никакого смысла в этом.

var fs = require('fs-extra') 
var file = '/tmp/this/path/does/not/exist/file.txt' 

fs.outputJson(file, {name: 'JP'}, function (err) { 
    console.log(err) // => null 
}); 

Это будет писать JSON.

Если вы хотите использовать JSONStream вы могли бы сделать что-то вроде этого:

var fs = require('fs');       
var jsonStream = require('JSONStream');   

var fl = fs.createWriteStream('dat.json');  

var out = jsonStream.stringifyObject();   
out.pipe(fl);          

obj = { test:10, ok: true };          
for (key in obj) out.write([key, obj[key]]);                     
out.end(); 
+1

Ваше первое предложение приводит к 'Фатальная ошибка: JS распределения не удалось - процесс из memory' – kevzettler

+0

Я только что изменил второй чтобы быть точным кодом для вашей ситуации, если большой массив. Попробуй это. –

+0

Я попробовал вторую версию, однако у меня есть большой вложенный объект как один из значений 'obj [key]', который вызывает то, что бросает ошибку выделения памяти. Мне нужно что-то similliar, которое является рекурсивным для дочерних объектов. – kevzettler