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.
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.
Share Improve this question asked Jan 26, 2018 at 8:58 twatorowskitwatorowski 931 silver badge3 bronze badges1 Answer
Reset to default 6The 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}));