【问题标题】:A little confused on this stream readable syntax对这种流可读语法有点困惑
【发布时间】:2014-08-21 14:04:12
【问题描述】:

我通读了流手册,他们有这个例子:

var Readable = require('stream').Readable;

var rs = new Readable;
rs.push('beep ');
rs.push('boop\n');
rs.push(null);

rs.pipe(process.stdout);

看起来正是我所需要的(将对象推入可读流并将其通过管道传输到可写流中。)

这就是我的想法

var Readable = require('stream').Readable;
var rs = new Readable;

app.get('/:foo', function(req, res) {
oboe(fs.createReadStream("/file"))
    .node( "{}", function(data) { 
          rs.push(data) 
     })
rs.pipe(res);

我正在使用双簧管在 fsStream 上侦听对象并对其进行修改。目前我将新发现的对象推入一个数组,然后在“完成”流事件中我会告诉 res.json 新创建的数组。这太重了内存,我想知道我是否可以在找到和修改对象时清空流,将其推送到可读流中,并且当可读流获取数据时,它会将其通过管道输出到 res 但仍保持一个对象。

但是我收到了这个错误

Error: not implemented at Readable._read

这是否意味着直播手册已过时?

【问题讨论】:

    标签: node.js express stream


    【解决方案1】:

    您不应该直接使用Readable。你应该继承它并编写自己的_read 实现;这就是为什么节点抱怨 Readable._read 没有实现。此外,节点流需要Strings 或Buffers,而不是JSON Objects,因此将双簧管的node 事件中的data 写入流可能会导致问题。

    我认为这里有一个比使用Readable 流更简单的解决方案。听起来您想获取双簧管给您的JSON Object,更改它,然后将其流出express 的res 对象。 res 本身是一个 Writable 流,因此,您可以简单地通过 write 多次访问它,直到完成为止。请注意,当双簧管完成时,您还必须在响应流 (res) 上调用 end()

    app.get('/:foo', function(req, res) {
        oboe(fs.createReadStream("/file"))
            .node( "{}", function(data) { 
                // ... transform data however you need ...
                res.write(JSON.stringify(data)); // Note that data is JSON.stringified here since res.write wants a String or a Buffer, not an Object
            })
            .done(function() {
                res.end();
            })
    })
    

    注意: 我假设您在响应的另一端有一些东西可以处理像这样流式传输的 JSON 对象。如果你还没有的话,你可能还需要像双簧管这样的东西。

    【讨论】:

    • 这太棒了。谢谢,现在很有意义。然而,我现在有 res.write 构造 json 对象。所以 res.write("[");然后在每个 stringify(data) 之后我添加了 +"," 然后在 res.end 之前的末尾添加了结尾]。尾随逗号在 IE9 中似乎不是问题,所以我将尝试这个,看看我的前端是否可以处理这些东西。谢谢!
    • 好吧,我现在遇到麻烦了。前端的双簧管说它没有看到一个对象,但我在开发工具中的网络清楚地显示了我的 json 的成功获取以及来自 Express 的正确标头。我对 Ajax 调用做了同样的事情,AJAX 内部的响应除了我的网络之外还有完整的对象,在 json 对象上显示了正确的 200 响应。不知道发生了什么。
    • 您确定额外的, 不会在您前端的双簧管中造成问题吗?
    • 是的,因为它是从自动写入的文件中读取的,为了检查逗号是否有问题,我强制流从现有文件中读取并删除那里的逗号。 JSON按原样通过。仍然有同样的问题。一位朋友告诉我这可能是 dom 问题,解决方法是在 div 中调用 ajax 以便 dom 识别它?我目前正在寻找更多相关信息。
    • 但是 res.write 正在将正确的 json 对象写入 HTTP 请求。就像我刚去 Localhost 并在屏幕上看到我的对象加载一样,它在那里非常好。但是通过任何电话,甚至通过双簧管,都会出现问题。在我做出更多结论之前,我可能愿意尝试其他浏览器端 json 流处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    相关资源
    最近更新 更多