Node.js Express中用async/await改造函数,解决CSV解析数据未定义问题
解决fast-csv解析CSV后数据undefined问题(改用async/await)
问题根源在于fast-csv的解析是基于事件的异步操作,初始代码中你在解析完成前就返回了数据,导致后续使用时parsedData还未被填充,因此得到undefined。通过将CSV读取逻辑封装为Promise,结合async/await即可解决这个问题。
初始问题代码(模拟常见错误写法)
const express = require('express'); const csv = require('@fast-csv/parse'); const fs = require('fs'); const app = express(); function readCsvFile(filePath) { let parsedData = []; csv.parseFile(filePath, { headers: true }) .on('data', row => parsedData.push(row)) .on('end', () => console.log('CSV解析完成')); // 解析未完成就返回,此时parsedData无有效数据 return parsedData; } function generateExcel(data) { console.log(data); // 打印undefined // 生成Excel的逻辑 } app.get('/convert', (req, res) => { const data = readCsvFile('./data.csv'); generateExcel(data); res.send('处理中'); }); app.listen(3000, () => console.log('服务器运行在3000端口'));
改造后的async/await版本
const express = require('express'); const csv = require('@fast-csv/parse'); const fs = require('fs'); const app = express(); // 将CSV读取封装为Promise,支持async/await async function readCsvFile(filePath) { return new Promise((resolve, reject) => { const parsedData = []; csv.parseFile(filePath, { headers: true }) .on('data', row => parsedData.push(row)) .on('end', () => resolve(parsedData)) // 解析完成后返回数据 .on('error', err => reject(err)); // 捕获解析错误 }); } // 生成Excel函数(若内部有异步操作,同样可加async) async function generateExcel(data) { console.log(data); // 现在能获取到完整的解析数据 // 这里添加你的Excel生成逻辑,比如使用xlsx库,有异步操作则加await } // Express路由改用async处理 app.get('/convert', async (req, res) => { try { const parsedData = await readCsvFile('./data.csv'); // 等待解析完成 await generateExcel(parsedData); // 等待Excel生成完成 res.send('处理完成'); } catch (err) { console.error('处理出错:', err); res.status(500).send('处理失败,请检查日志'); } }); app.listen(3000, () => console.log('服务器运行在3000端口'));
关键改动说明
- Promise封装:把
readCsvFile改成返回Promise的函数,在end事件触发时通过resolve返回解析好的数据,错误时通过reject抛出异常。 - async/await等待:在路由处理函数前加
async,用await等待CSV解析完成,确保拿到有效数据后再调用生成Excel的函数。 - 错误捕获:用
try/catch包裹异步操作,处理解析或生成Excel过程中出现的错误,避免服务器崩溃并返回友好的错误响应。
内容的提问来源于stack exchange,提问作者devZ
相关产品推荐
相关产品推荐

