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.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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}));
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0