如何获取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
相关产品推荐
相关产品推荐

