Tag: node.js stream

正确的方法来清除一个streams2pipe道并清空它(不只是刷新)

前提 我试图find正确的方法提前终止在Node.js中的一系列pipe道stream(pipe道):有时我想优雅地中止stream在它完成之前。 具体来说,我正在处理大多数objectMode: true和非本地的并行stream,但这应该不重要。 问题 问题是当我unpipe调整pipe道时,数据保留在每个stream的缓冲区中,并被drain 。 对于大多数中间stream(例如Readable / Transform )来说,这可能是可以的,但最后一个Writable仍然会stream到它的写入目标(例如文件或数据库或套接字或w / e)。 如果缓冲区包含数百或数千个需要耗费大量时间的块,这可能是有问题的。 我希望它立即停止,即不要stream失; 为什么浪费周期和内存上的数据无关紧要? 根据我走的路线,我会收到一个“写完后”的错误,或者当一个stream找不到现有pipe道的exception。 题 a.pipe(b).pipe(c).pipe(z)的formsa.pipe(b).pipe(c).pipe(z)streampipe道的正确方法是什么? 解? 我提出的解决scheme是3步: 以相反的顺序在pipe道中unpipe每个stream 清空实现Writable每个stream的缓冲区 end实现Writable每个stream 一些说明整个过程的伪代码: var pipeline = [ // define the pipeline readStream, transformStream0, transformStream1, writeStream ]; // build and start the pipeline var tmpBuildStream; pipeline.forEach(function(stream) { if ( !tmpBuildStream ) { tmpBuildStream = […]

单stream的多重消费

我想知道是否有可能多个函数可以消耗node.js中的单个stream。 如果是的话这个怎么办? 是否可以pipe道到多个目的地? 我想在两个不同的平行function中使用这个stream。 我正在使用asynchronous模块进行并行stream程。 那么是否可以说在这些函数中发出pipe()语句? 提前致谢。

Node.js中的本地和全局模块有什么区别? 何时使用本地和全局模块?

我们可以使用require函数访问本地模块,但不能通过它访问全局模块。 我读了一些地方,使用全局模块,我们需要使其本地,然后通过需求function导入。 所以如果我们不能直接访问全局模块,那么使用它的需求是什么。

pipe道到标准输出和可写入的stream

我正在通过一个双工string( 通过礼貌)pipe道文件,我无法打印信息stdout 和写入文件。 一个或另一个工作得很好。 var fs = require('fs'); var path = require('path'); var through = require('through'); // easy duplexing, i'm young catify = new through(function(data){ this.queue(data.toString().replace(/(woof)/gi, 'meow')); }); var reader = fs.createReadStream('dogDiary.txt'); // woof woof etc. var writer = fs.createWriteStream(path.normalize('generated/catDiary.txt')); // meow meow etc. // yay! reader.pipe(catify).pipe(writer) // blank file. T_T reader.pipe(catify).pipe(process.stdout).pipe(writer) 我假设这是因为process.stdout是一个可写的stream,但我不知道如何做我想要的(我试过传递{end: false}无济于事)。 仍然努力把我的头围绕溪stream,所以原谅我,如果我错过了明显的东西:)

从两个pipe道stream创build一个Node.jsstream

如果可能的话,我想将两个Node.jsstream合并为一个。 我正在使用变换stream。 换句话说,我想让我的图书馆返回myStream供人们使用。 例如,他们可以写: process.stdin.pipe(myStream).pipe(process.stdout); 而在内部,我正在使用第三方vendorStream ,它执行一些工作,将其插入myInternalStream包含的自己的逻辑。 那么上面的内容会转化为: process.stdin.pipe(vendorStream).pipe(myInternalStream).pipe(process.stdout); 我可以做那样的事吗? 我试过var myStream = vendorStream.pipe(myInternalStream)但是显然不起作用。 为了与bash做个比喻,假设我想编写一个程序来检查字母h是否存在于某个stream的最后一行( tail -n 1 | grep h ),我可以创build一个shell脚本: # myscript.sh tail -n 1 | grep h 然后如果人们这样做: $ printf "abc\ndef\nghi" | . myscript.sh 它只是工作。 这是我迄今为止: // Combine a pipe of two streams into one stream var util = require('util') , Transform […]

如何在Node.js中将一个可读的stream一次写入两个可写的stream?

目标是: 创build一个文件读取stream。 将其pipe理到gzip( zlib.createGzip() ) 然后将读取的zlib输出stream传递给: 1)HTTP response对象 2) 和可写文件stream来保存压缩的输出。 现在我可以做到3.1: var gzip = zlib.createGzip(), sourceFileStream = fs.createReadStream(sourceFilePath), targetFileStream = fs.createWriteStream(targetFilePath); response.setHeader('Content-Encoding', 'gzip'); sourceFileStream.pipe(gzip).pipe(response); …这工作正常,但我还需要将gzip压缩的数据保存到一个文件,以便我不需要每次重新压缩,并能够直接streamgzip的数据作为响应。 那么,如何在节点中将一个可读stream一次性传递到两个可写stream中? 会sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream); 在Node 0.8.x中工作?

如何实现一个可写的stream

我想将数据从亚马逊kinesisstream传输到s3日志或bunyan日志。 该示例使用文件写入stream或标准输出。 我将如何暗示自己的可写入stream? //this works var file = fs.createWriteStream('my.log') kinesisSource.pipe(file) 这不起作用,说它没有方法'上' var stream = {}; //process.stdout works however stream.writable = true; stream.write =function(data){ console.log(data); }; kinesisSource.pipe(stream); 我有什么方法来实现我自己的自定义可写stream,文档似乎表明我需要实现'写'而不是'开'