Node.js中Readable流消费Buffer时不触发end事件问题咨询
修复方案
你需要通过偏移量跟踪Buffer的读取进度,读取完所有内容后调用this.push(null)触发end事件,同时修正事件监听的笔误。
具体修改点
- 在
readStream函数内部添加偏移量变量,记录已推送的字节位置 - 每次
read方法被调用时,按请求的字节数截取Buffer片段推送 - 当偏移量超过Buffer总长度时,推送
null标记流结束 - 修正结束事件的监听名称,把
and改为end
修复后完整代码
const { Readable } = require('stream'); // 创建长度为200的Buffer,填充指定文本 const buf = Buffer.alloc(200, 'this is a loooong text..'); const readStream = (buf_data) => { // 记录已读取的偏移量 let offset = 0; const bufLength = buf_data.length; return new Readable({ read(size){ // 已经读完所有内容,触发结束 if (offset >= bufLength) { this.push(null); return; } // 截取当前要推送的片段,最多取size个字节 const chunk = buf_data.slice(offset, offset + size); // 推送片段 this.push(chunk); // 更新偏移量 offset += chunk.length; } }) } // 传入Buffer创建可读流 const read = readStream(buf) // 监听data事件打印内容 read.on('data', (chunk) => { console.log('chnk:', chunk.toString()) }) // 修正事件名,监听end事件 read.on('end', () => { console.log('--end--') })
逻辑说明
- 闭包中存储的
offset变量会记录每次推送的结束位置,避免重复推送整个Buffer - 当
offset大于等于Buffer总长度时,调用this.push(null),流会自动触发end事件,终止读取
内容的提问来源于stack exchange,提问作者Theo Itzaris
相关产品推荐
相关产品推荐

