gpt4 book ai didi

javascript - 在 node.js 中过滤 Stream 对象

转载 作者:搜寻专家 更新时间:2023-10-31 22:29:32 25 4
gpt4 key购买 nike

在我看来,在 Node.js 中处理某些类型的数据的一种优雅方式是链接处理对象,例如 UNIX 管道。

例如,grep:

function Grep(pattern) {
...
}
util.inherits(Grep, stream.Stream);

Grep.prototype.???? = ??????? // What goes here?

grep = new Grep(/foo/);

process.stdin.pipe(grep);
myStream.pipe(process.stdout);

但是我一点都不清楚需要如何覆盖各种 Stream 方法才能使其工作。

如何创建一个 Stream 对象,该对象仅从其输入复制到其输出?据推测,有了这个答案,更复杂的过滤流就变得微不足道了。

更新:感觉好像下面的应该可以工作(用 CoffeeScript 表达,所以我没有用 JS 语法填充这个框!):

class Forwarder extends stream.Stream
write: (chunk, encoding) ->
@emit 'data', chunk
end: (chunk, encoding) =>
if chunk?
@emit 'data', chunk
@emit 'end'

fwd = new Forwarder()
fwd.pipe(process.stdout);
process.stdin.pipe(fwd);
process.stdin.resume();

然而,向该脚本添加内容不会输出任何内容。在脚本中显式调用 fwd.write() 会导致在 stdout 上输出。

最佳答案

你们很亲近。

因为您使用的是非常低级的流类,所以您需要设置流的可写属性,使其成为可写流。如果您从流中读取,则需要设置可读属性。此外,结束事件没有任何参数。

class Forwarder extends stream.Stream
constructor: ->
@writable = true
write: (chunk, encoding) ->
@emit 'data', chunk
end: ->
@emit 'end'

fwd = new Forwarder()
fwd.pipe(process.stdout);
process.stdin.pipe(fwd);
process.stdin.resume();

更新

上述答案适用于 Node <= 0.8 中的 V1 流。如果您使用的是 > 0.8,Node 添加了更多旨在扩展的特定类,因此您可以使用更像这样的东西:

class Forwarder extends stream.Transform
_transform: (chunk, encoding, callback) ->
this.push(chunk);
callback();

处理 chunk 并推送您真正想要的片段。

关于javascript - 在 node.js 中过滤 Stream 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com