从可读流中读取对象会导致TypeError异常

时间:2018-01-26 08:58:29

标签: javascript node.js stream

我正在尝试使以下代码工作:

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);

根据node.js的Streams文档,由于 objectMode 选项设置为 true,因此从此类流中读取非字符串/非缓冲区对象应该没有问题。然而我最终得到的是以下错误:

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)

如果 this.push({a:1})更改为,请说 this.push('abc')然后一切都像魅力和我的控制台窗口充斥着'abc'。

另一方面,如果我将 objectMode 设置为 false 并仍尝试推送 {a:1} 之类的对象,那么错误消息更改为:

TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be one of type string, Buffer, or Uint8Array

所以 objectMode 确实改变了一些事情,但并不完全像我期望的那样。

我正在使用9.4.0版本的node.js.

1 个答案:

答案 0 :(得分:4)

堆栈跟踪表明问题不在Readable信息流中,而在Writable信息流中,您将信息汇总到(process.stdout)。

将其替换为Writable设为objectMode的{​​{1}}流,您的错误就会消失。

true