gpt4 book ai didi

node.js - 基本流问题: Difficulty sending a string to stdout

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:38 25 4
gpt4 key购买 nike

我刚刚开始学习 Node 中的流。我在内存中有一个字符串,我想将其放入应用转换的流中,并将其通过管道传输到 process.stdout。这是我的尝试:

var through = require('through');

var stream = through(function write(data) {
this.push(data.toUpperCase());
});

stream.push('asdf');

stream.pipe(process.stdout);

stream.end();

它不起作用。当我通过 Node 在 cli 上运行脚本时,没有任何内容发送到 stdout,也不会引发任何错误。我有几个问题:

  1. 如果您想将内存中的值放入流中,最好的方法是什么?
  2. 推送队列有什么区别?
  3. 在调用 pipe() 之前或之后调用 end() 有什么关系吗?
  4. end() 等同于 push(null) 吗?

谢谢!

最佳答案

只需使用普通流 API

var Transform = require("stream").Transform;

// create a new Transform stream
var stream = new Transform({
decodeStrings: false,
encoding: "ascii"
});

// implement the _transform method
stream._transform = function _transform(str, enc, done) {
this.push(str.toUpperCase() + "\n";
done();
};

// connect to stdout
stream.pipe(process.stdout);

// write some stuff to the stream
stream.write("hello!");
stream.write("world!");

// output
// HELLO!
// WORLD!
<小时/>

或者您可以构建自己的流构造函数。这确实是流 API 的使用方式

var Transform = require("stream").Transform;

function MyStream() {
// call Transform constructor with `this` context
// {decodeStrings: false} keeps data as `string` type instead of `Buffer`
// {encoding: "ascii"} sets the encoding for our strings
Transform.call(this, {decodeStrings: false, encoding: "ascii"});

// our function to do "work"
function _transform(str, encoding, done) {
this.push(str.toUpperCase() + "\n");
done();
}

// export our function
this._transform = _transform;
}

// extend the Transform.prototype to your constructor
MyStream.prototype = Object.create(Transform.prototype, {
constructor: {
value: MyStream
}
});

现在像这样使用它

// instantiate
var a = new MyStream();

// pipe to a destination
a.pipe(process.stdout);

// write data
a.write("hello!");
a.write("world!");

输出

HELLO!
WORLD!
<小时/>

关于 .push.write 的其他一些注意事项。

  • .write(str) 将数据添加到可写缓冲区。它的意思是外部调用。如果您将流视为双工文件句柄,那么它就像 fwrite 一样,只是进行了缓冲。

  • .push(str) 将数据添加到可读缓冲区。它只能从我们的流中调用。

  • .push(str) 可以被调用多次。看看如果我们将函数更改为会发生什么

    function _transform(str, encoding, done) {
    this.push(str.toUpperCase());
    this.push(str.toUpperCase());
    this.push(str.toUpperCase() + "\n");
    done();
    }

    输出

    HELLO!HELLO!HELLO!
    WORLD!WORLD!WORLD!

关于node.js - 基本流问题: Difficulty sending a string to stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25508858/

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