使用axios获取AWS S3公开CSV并通过csv-parser解析失败求助
问题解决:axios获取S3 CSV后无法用csv-parser解析
问题原因
csv-parser是流处理工具,它需要接收可读流(Readable Stream)作为输入。你当前用axios默认返回的是字符串格式的response.data,直接把字符串传给csv-parser,它无法触发data/end等流事件,自然不会解析数据也捕获不到错误。而本地用fs.createReadStream()传入的是流,所以能正常解析。
修复方案
修改axios请求配置让它返回流而非字符串,将响应流直接传给csv-parser处理,同时完善异步逻辑的Promise封装。
修复后的代码
const fs = require("fs") const csvParser = require("csv-parser") const axios = require("axios") async function parseCSVFile(filePath) { return new Promise((resolve, reject) => { let parsedData = [] axios.get(filePath, { // 关键配置:让axios返回可读流 responseType: 'stream' }).then(response => { // 将响应流直接导入csv-parser response.data .pipe(csvParser({ headers: true })) .on('data', data => { parsedData.push(data) }) .on('end', () => { console.log('CSV data parsed', parsedData); resolve(parsedData) // 解析完成后返回数据,方便后续存入数据库 }) .on('error', err => { console.error("Error parsing CSV data:", err); reject(err) // 抛出解析阶段错误 }) }).catch(err => { console.error("Error fetching CSV file:", err); reject(err) // 捕获请求阶段错误 }) }) } // 调用示例 // parseCSVFile('https://your-s3-bucket-url.csv') // .then(data => { /* 写入本地数据库的逻辑 */ }) // .catch(err => { /* 全局错误处理 */ })
关键改动说明
- 添加
responseType: 'stream'配置:让axios返回HTTP响应流,而非将整个响应体转为字符串 - 使用
.pipe()方法:这是Node.js流处理的标准方式,能触发csv-parser的所有事件 - 用Promise封装流程:原函数是async但未处理异步逻辑,封装后可以通过
await或.then()获取解析结果 - 完善错误捕获:同时覆盖请求和解析两个阶段的错误,避免异常被吞掉
内容的提问来源于stack exchange,提问作者indigo
相关产品推荐
相关产品推荐

