如何在水平(Node.js)中使用管道



LevelUP文档说可以使用pipe()(https://github.com/rvagg/node-levelup/#pipes-and-node-stream-compatibility(。

我尝试了以下代码:

db.createValueStream().pipe(response)

但我做不到,我有一个错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
TypeError: Invalid non-string/buffer chunk
    at validChunk (_stream_writable.js:150:14)
    at Writable.write (_stream_writable.js:179:12)
    at write (_stream_readable.js:573:24)
    at flow (_stream_readable.js:582:7)
    at ReadStream.pipeOnReadable (_stream_readable.js:614:5)
    at ReadStream.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    at emitReadable (_stream_readable.js:404:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at ReadStream.Readable.push (_stream_readable.js:127:10)

实际问题是关于使用事件"data"((时的内存使用情况。然后我试图做一个流。转换并使用pipe()来做我需要的事情。一旦事件emmiter中的内存泄漏是一个问题:在Node中使用流时内存泄漏.js?

更新

我试过@paul胡凝胶但没有成功。错误事件的函数没有被调用,并且它崩溃了。这是一段代码:

    var rs = db.createValueStream();
    request.on('close', function(){
        rs.destroy();
        response.end();
    });
    rs.on('end', function(){
        response.end();
    });
    rs.on('error', function(err){
        console.err('READ STREAM ERROR:',err.message);
        response.end();
        rs.destroy();
    });
    response.on('error', function(err){
        console.log('RESPONSE ERROR:',err);
        rs.destroy();
    });
    rs.pipe(stringifier).pipe(response);

需要考虑多种因素。

首先,您

会收到此异常,因为您不侦听 error 事件。对于流,请始终收听它,i(将允许您记录问题ii(不会使程序崩溃。

var valueStream = db.createValueStream()
valueStream.on('error', function (err) {
  console.error('valueStream.on error ' + err.message);
});
valueStream.pipe(response);
response('error', function (err) {
  console.error('response error ' + err.message);
});

其次,db.createValueStream()对象模式下创建一个可读的流(参见源代码(:它将输出javascript对象。另一方面,您的response是字节模式下的可写流:它只接受字节作为输入,因此error事件。您可以做的是创建一个转换流,该流将javascript对象作为输入并输出其字符串化版本:

var stream = require('stream')
var stringifier = new stream.Transform();
stringifier._writableState.objectMode = true;
stringifier._transform = function (data, encoding, done) {
    this.push(JSON.stringify(data));
    this.push('n');
    done();
}
valueStream.pipe(stringifier).pipe(response);

请注意,我们创建了一个转换流,它将对象作为输入和输出字节。有关详细信息,请参阅文档。

但是,您必须告诉我们有关您尝试通过将分级流管道到请求中来解决的特定问题的更多信息:上述解决方案不是一个很好的解决方案。

第三,您在使用.on('data')时没有遇到内存泄漏。添加此侦听器会将流转换为流动模式,这意味着它将尽快输出数据。您始终可以使用.pause().resume()方法来停止和重新启动流。但是使用新的 v0.10 流接口(又名 streams2(可以帮助您处理此问题,因为 ReadableWritableTransform 类会为您处理所有这些问题。

相关内容

  • 没有找到相关文章

最新更新