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

Node.js Readable流出现重复记录:原因及修复方案咨询

问题原因与修复方案

重复记录的原因

原Readable流代码的问题出在Node.js Readable流的read()调用机制上:

  • Readable流会在内部缓冲区需要补充数据时,反复调用read()方法。
  • 你的read()是异步方法,还嵌套了while(true)无限循环。当第一次read()里的await getMovements处于等待状态时,流可能因为缓冲区空了,再次触发read()调用。此时page变量还没完成递增,导致多次请求同一页的交易记录,最终输出重复数据。

修复Readable流的方案

去掉read()内部的无限循环,让每次read()只处理一页数据,依赖流自身的调用机制来触发下一次数据获取,这样就能避免重复请求同一页:

const readMovements = new Readable({
  async read() {
    // 标记已完成,避免重复执行无效逻辑
    if (this._finished) return;

    const movements = await getMovements(page, perPage);

    if (movements.length) {
      const data = JSON.stringify(movements);
      page++;
      // 推送数据后,流会在需要时自动再次调用read()
      this.push(data);
    } else {
      this._finished = true;
      this.push(null);
    }
  },
});

修复逻辑说明

  1. 添加_finished属性标记是否已无更多数据,避免read()被重复调用后执行无效逻辑。
  2. 每次read()仅获取一页数据,推送后由流自身机制决定是否再次调用read()(当缓冲区需要补充数据时)。
  3. 当没有更多数据时,标记_finished并推送null结束流,确保流正常关闭。

内容的提问来源于stack exchange,提问作者Daniel Lucas Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:33:23