我通读了流手册,他们有了这个例子:
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
这是否意味着流手册已过期?
答案 0 :(得分:2)
您不应该直接使用Readable
。您应该将其子类化并编写自己的_read
实现;这就是为什么节点抱怨Readable._read
没有实现的原因。此外,节点流需要String
或Buffer
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对象。如果你还没有,那么你也可能需要像双簧管这样的东西。