I'm trying to make the following code work:
var stream = require('stream');
class MyReadable extends stream.Readable {
constructor(options) {
super(options);
}
_read(size) {
this.push({a: 1});
}
}
var x = new MyReadable({objectMode: true});
x.pipe(process.stdout);
According to Streams documentation of node.js there should be no problem reading non-string/non-Buffer objects from such stream thanks to objectMode option being set to true. And yet what I end up with is the following error:
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be one of type string or Buffer
at validChunk (_stream_writable.js:253:10)
at WriteStream.Writable.write (_stream_writable.js:288:21)
at MyReadable.ondata (_stream_readable.js:646:20)
at MyReadable.emit (events.js:160:13)
at MyReadable.Readable.read (_stream_readable.js:482:10)
at flow (_stream_readable.js:853:34)
at resume_ (_stream_readable.js:835:3)
at process._tickCallback (internal/process/next_tick.js:152:19)
at Function.Module.runMain (module.js:703:11)
at startup (bootstrap_node.js:193:16)
If this.push({a: 1}) was changed to, let's say this.push('abc') then everything works like a charm and my console window gets flooded with 'abc'.
On the other hand, if I set objectMode to false and still try to push objects like {a: 1} then the error message changes to:
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be one of type string, Buffer, or Uint8Array
So objectMode does change some things but not exactly as I would expect it to.
I'm using 9.4.0 version of node.js.
The stacktrace indicates that the problem is not in the Readable
stream, but in the Writable
stream that you're piping it to (process.stdout
).
Replace it with a Writable
stream that has objectMode
set to true
, and your error will go away.
var stream = require('stream');
class MyReadable extends stream.Readable {
constructor(options) {
super(options);
}
_read(size) {
this.push({a: 1});
}
}
class MyWritable extends stream.Writable {
constructor(options) {
super(options);
}
_write(chunk) {
console.log(chunk);
}
}
var x = new MyReadable({objectMode: true});
x.pipe(new MyWritable({objectMode: true}));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With