【问题标题】:Reading serialized array of objects from a file in node js从节点js中的文件中读取序列化的对象数组
【发布时间】:2017-02-25 07:28:54
【问题描述】:

我有一个文件,其中序列化了对象数组。我需要逐个对象流式传输文件对象。

我关于 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;
   }
}

还有更好的选择吗?我还需要定义自己的数据边界吗? 请注意,我需要序列化的对象是连续的。也就是说,它们将随着时间的推移而不是一次被接收。

【问题讨论】:

    标签: javascript json node.js serialization


    【解决方案1】:

    在您当前的实现中,JSON.parse 只会成功一次,此时整个 json 都在 buff 变量中,因为这是整个文件的唯一前缀是有效的 json。

    相反,您应该使用oboejs,一个流式 json 解析器。使用方法如下:

    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>

    或者适应你的例子:

    const oboe = require("oboe");
    oboe(fs.createReadStream('file.txt')).node("!.*", node => {
        process(node);
        return oboe.drop;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2023-03-03
      • 1970-01-01
      • 2015-04-03
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多