【问题标题】:fs.readstream to read an object and then pipe to writeable to file?fs.readstream 读取对象,然后通过管道传输到可写文件?
【发布时间】:2014-08-04 15:09:27
【问题描述】:

目前我有一个模块可以拉取这样的 sql 结果:

[{ID: 'test', NAME: 'stack'},{ID: 'test2', NAME: 'stack'}]

我只想将其直接写入文件,以便稍后将其作为对象读取,但我想通过流写入它,因为某些对象确实非常巨大,并且将它们保存在内存中不再起作用。

我正在使用 mssql https://www.npmjs.org/package/mssql

我被困在这里:

    request.on('recordset', function(result) {
        console.log(result);
    });

如何将其流式传输到可写流?我看到了对象模式的选项,但我似乎不知道如何设置它?

    request.on('recordset', function(result) {
        var readable = fs.createReadStream(result),
            writable = fs.createWriteStream("loadedreports/bot"+x[6]);
        readable.pipe(writable);
    });

这只是错误,因为 createReadStream 必须是文件路径...

我是在正确的轨道上还是我需要做其他事情?

【问题讨论】:

    标签: json node.js object stream


    【解决方案1】:

    您几乎走在了正确的轨道上:您只是不需要可读流,因为您的数据已经以块的形式到达。

    然后,您可以在实际'recordset'-Event 之外创建可写流,否则每次获得新块时都会创建一个新流(这不是您想要的)。

    试试这样:

     var writable = fs.createWriteStream("loadedreports/bot"+x[6]);
     request.on('recordset', function(result) {
        writable.write(result);
     });
    

    编辑

    如果记录集已经太大,使用row-Event:

       request.on('row', function(row) {
       // Same here
       });
    

    【讨论】:

    • 我收到一个类型错误:无效的非字符串/缓冲区块
    • 我添加了 JSON.stringify(result) 然后将其用作我的 writable.write(stringified) ,这似乎有效。显然它改变了我的对象,但我想这会发生。现在我必须改变我现在阅读文件的方式。谢谢!
    • 那很奇怪...您是否通过设置选项`stream: true`来启用流式传输(我猜是这样,否则它可能不起作用)?您使用的是结果集还是行事件?你听done-Event 然后关闭写流吗?
    • 我没有这样做。我不知道听完并关闭写流。像这样的东西? request.on('done', function(end) { writable.close(end); });
    • 其实读到这里,我不需要使用 fs.close。 stackoverflow.com/questions/21176733/… 那可能是什么问题?我猜 MSSQL 流在写入后仍然保留每一行。我需要排干 MSSQL 部分
    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2011-07-17
    • 2014-06-19
    • 2016-06-11
    • 2016-06-14
    • 2023-03-24
    相关资源
    最近更新 更多