从可读流读取对象触发TypeError异常问题求助
问题解析与解决方案
嘿,这个问题我之前也碰到过,核心原因其实很简单:你的可读流开了objectMode,但要 pipe 过去的process.stdout可没开启这个模式啊!
Node.js的流管道是双向协作的,数据从可读流流向可写流时,两边的格式规则得匹配。process.stdout是标准输出流,默认只认字符串、Buffer或者Uint8Array类型的数据,根本不接受对象类型的内容——哪怕你的可读流允许推送对象,下游不兼容也白搭,这不就触发类型错误了嘛。
为啥开了objectMode还是报错?
你给可读流设置objectMode: true,只是让这个可读流本身允许推送对象,但下游的process.stdout并没有开启对象模式,它依然会严格校验每一个进来的chunk类型,所以对象一过去就触发了报错。
两种实用解决办法
1. 直接在可读流里转换对象格式
最简单的方式,就是在_read方法里把对象转换成JSON字符串再推送,比如:
var stream = require('stream'); class MyReadable extends stream.Readable { constructor(options) { super(options); } _read(size) { // 转成JSON字符串再加个换行,控制台输出更清晰 this.push(JSON.stringify({a: 1}) + '\n'); } } var x = new MyReadable({objectMode: true}); x.pipe(process.stdout);
2. 用转换流做中间层处理
如果想保持可读流的对象模式(比如后续还要用对象做其他业务处理),可以加一个Transform流当中间层,专门负责把对象转成stdout能接受的格式:
var stream = require('stream'); const { Transform } = require('stream'); class MyReadable extends stream.Readable { constructor(options) { super(options); } _read(size) { this.push({a: 1}); } } // 这个转换流允许接收对象,然后转成字符串输出 const objectToText = new Transform({ writableObjectMode: true, transform(chunk, encoding, callback) { this.push(JSON.stringify(chunk) + '\n'); callback(); } }); var x = new MyReadable({objectMode: true}); x.pipe(objectToText).pipe(process.stdout);
这种方式更灵活,要是以后需要对对象做更多加工处理,直接在转换流里扩展逻辑就行。
额外补充说明
你把objectMode设为false时,错误信息变了,那是因为此时可读流自己就不允许推送对象了,报错来自可读流自身的校验;而开objectMode时的错误是来自下游可写流的校验,这俩是流管道不同环节的问题哦。
内容的提问来源于stack exchange,提问作者twatorowski
相关产品推荐
相关产品推荐

