我有一个文件,其中我已经序列化了对象数组。我需要按对象流式传输文件。
关于nodejs流的问题是,我是否必须处理数据边界?也就是说,nodejs可读流逐行发出。所以在每一行之后,我应该检查它是否是一个有效的JSON对象吗?
我目前的实现是这样的
f = fs.createReadStream('file.txt');
let buff = '';
f.on('data', (data) => {
buff += data;
try {
process(JSON.parse(buff));
buff = '';
} catch (e) {
return;
}
}
有更好的选择吗?我还需要定义自己的数据边界吗? 请注意,我需要序列化的对象是连续的。也就是说,它们将随着时间的推移而不是一次收到。
答案 0 :(得分:3)
在你当前的实现中,当整个json在buff变量中时,JSON.parse
只会成功一次,因为这是整个文件中唯一有效json的前缀。
相反,您应该使用流媒体json解析器oboejs。以下是如何使用它:
const parser = oboe().node("!.*", node => {
console.log(node);
return oboe.drop;
});
Rx.Observable.from(`[
{"name": "foo"},
{"name": "bar"},
]`).zip(Rx.Observable.interval(10), a=>a).subscribe(char => {
// console.log(char);
parser.emit("data", char);
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/oboe.js/2.1.3/oboe-browser.js"></script>
&#13;
或者根据你的例子进行调整:
const oboe = require("oboe");
oboe(fs.createReadStream('file.txt')).node("!.*", node => {
process(node);
return oboe.drop;
});