You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:08