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

如何获取fs.createReadStream返回的数据?CSV解析返回流对象问题

问题原因

你当前的代码里,await 作用在 fs.createReadStream().pipe(csv()) 上,但这个表达式返回的是CsvParser流对象,而非你期望的处理后的数据。因为Node.js的流是基于事件驱动的异步模型,await 无法直接等待流的 end 事件完成,外层函数会直接返回流对象,而 end 回调里的 return obj 也不会被外层函数捕获。

解决方案

将流的处理逻辑封装在 Promise 中,通过手动控制 resolve 和 reject 来返回最终结果:

const fs = require("fs");
const csv = require("csv-parser");
const path = require("path");

const file = path.resolve(__dirname, "./file");

export const parseCsv = async () => {
  return new Promise((resolve, reject) => {
    const result = [];

    fs.createReadStream(file)
      .pipe(csv())
      .on("data", (data) => {
        result.push(data);
      })
      .on("end", () => {
        const obj = {};
        result.forEach((service) => {
          if (!obj[service.code]) {
            obj[service.code] = service.rate;
          }
        });
        resolve(obj); // 在这里返回处理后的对象
      })
      .on("error", (err) => {
        reject(err); // 捕获流处理中的错误
      });
  });
};
关键说明
  • 用 Promise 包裹流操作,让异步的事件驱动逻辑可以被 async/await 正确等待
  • 在 end 事件回调中调用 resolve(obj),将处理好的对象作为Promise的结果返回
  • 添加 error 事件监听,调用 reject(err) 处理读取或解析过程中出现的错误,避免未捕获的异常

内容的提问来源于stack exchange,提问作者Michael Sanford

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:41:27