这个流可读语法有点困惑

时间:2014-08-21 14:04:12

标签: node.js express stream

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

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);

我正在使用oboe来监听fsStream中的对象并修改它们。目前我正在将新发现的对象推送到一个数组中然后在"完成"流事件我会告诉express res.json新创建的数组。这太重了内存,我想知道我是否可以在找到并修改对象时清空流,将其推入可读状态,并且当可读流获取数据时,它会将其传输到res但仍保留一个对象。

但是我收到了这个错误

Error: not implemented at Readable._read

这是否意味着流手册已过期?

1 个答案:

答案 0 :(得分:2)

您不应该直接使用Readable。您应该将其子类化并编写自己的_read实现;这就是为什么节点抱怨Readable._read没有实现的原因。此外,节点流需要StringBuffer s,而不是JSON Object s,因此将来自oboe的data事件的node写入流将可能会引起问题。

我认为这里比使用Readable流更简单。听起来你想要拿出双簧管给你的JSON Object,改变它,并将它流出快递res对象。 res本身就是一个Writable信息流,因此您可以简单地write向其end()转发,而不是通过中间信息流。完成。请注意,当双簧管完成时,您还必须在响应流(res)上调用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(); }) })

{{1}}

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