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); } }, });
修复逻辑说明
- 添加
_finished属性标记是否已无更多数据,避免read()被重复调用后执行无效逻辑。 - 每次
read()仅获取一页数据,推送后由流自身机制决定是否再次调用read()(当缓冲区需要补充数据时)。 - 当没有更多数据时,标记
_finished并推送null结束流,确保流正常关闭。
内容的提问来源于stack exchange,提问作者Daniel Lucas Santos
相关产品推荐
相关产品推荐

