对象模式的双工流
对于 Duplex
流,可以分别使用 readableObjectMode
和 writableObjectMode
选项为 Readable
或 Writable
侧专门设置 objectMode
。
例如,在下面的示例中,创建了新的 Transform
流(它是 Duplex
流),它具有对象模式的 Writable
端,该端接受 JavaScript 数字,这些数字在 Readable
端转换为十六进制字符串。
const { Transform } = require('node:stream');
// 所有转换流也是双工流。
const myTransform = new Transform({
writableObjectMode: true,
transform(chunk, encoding, callback) {
// 如有必要,将块强制为数字。
chunk |= 0;
// 将块转换为其他东西。
const data = chunk.toString(16);
// 将数据推送到可读队列中。
callback(null, '0'.repeat(data.length % 2) + data);
}
});
myTransform.setEncoding('ascii');
myTransform.on('data', (chunk) => console.log(chunk));
myTransform.write(1);
// 打印: 01
myTransform.write(10);
// 打印: 0a
myTransform.write(100);
// 打印: 64
For Duplex
streams, objectMode
can be set exclusively for either the
Readable
or Writable
side using the readableObjectMode
and
writableObjectMode
options respectively.
In the following example, for instance, a new Transform
stream (which is a
type of Duplex
stream) is created that has an object mode Writable
side
that accepts JavaScript numbers that are converted to hexadecimal strings on
the Readable
side.
const { Transform } = require('node:stream');
// All Transform streams are also Duplex Streams.
const myTransform = new Transform({
writableObjectMode: true,
transform(chunk, encoding, callback) {
// Coerce the chunk to a number if necessary.
chunk |= 0;
// Transform the chunk into something else.
const data = chunk.toString(16);
// Push the data onto the readable queue.
callback(null, '0'.repeat(data.length % 2) + data);
}
});
myTransform.setEncoding('ascii');
myTransform.on('data', (chunk) => console.log(chunk));
myTransform.write(1);
// Prints: 01
myTransform.write(10);
// Prints: 0a
myTransform.write(100);
// Prints: 64