NodeJS使用promised-csv读取CSV文件返回空数组问题求助
解决promised-csv读取CSV返回空数组的问题
嘿,你这是踩了异步操作的经典坑啦!promised-csv是基于事件驱动的异步模块,但你的函数在调用reader.read()之后立刻就返回了output数组——这时候CSV文件还没开始读取呢,row事件根本没触发,返回空数组也就不奇怪了。
两种靠谱的解决办法
办法1:用Promise封装异步逻辑
我们可以把整个读取过程包成一个Promise,等end事件触发(也就是文件读完了)再返回结果,这样就能保证拿到完整的数据:
const inputFile = './test/example_result.csv'; // 注意路径里的反斜杠要转义,或者直接用正斜杠更稳妥 const CsvReader = require('promised-csv'); function readCSV(inputFile) { return new Promise((resolve, reject) => { const reader = new CsvReader(); const output = []; reader.on('row', (data) => { output.push(data[0]); }); // 读完文件后返回结果 reader.on('end', () => { resolve(output); }); // 别忘了处理错误 reader.on('error', (err) => { reject(err); }); reader.read(inputFile); }); } // 调用的时候得用异步方式,比如async/await async function runTest() { try { const csvData = await readCSV(inputFile); console.log(csvData); // 这里就能拿到完整的字符串数组啦 } catch (err) { console.error('读取CSV出错:', err); } } runTest();
办法2:直接用模块的Promise风格API
其实promised-csv本身就提供了Promise形式的readAll方法,用它更简洁,不用自己监听事件:
const inputFile = './test/example_result.csv'; const CsvReader = require('promised-csv'); async function readCSV(inputFile) { const reader = new CsvReader(); // readAll会返回所有行的数组,我们再提取每行第一个元素 const allRows = await reader.readAll(inputFile); return allRows.map(row => row[0]); } // 调用示例,用.then/.catch也可以 readCSV(inputFile) .then(result => console.log('读取结果:', result)) .catch(err => console.error('出错了:', err));
额外提醒
- 你原来的路径写的是
.\test\example_result.csv,Windows下反斜杠要写成\\,或者直接用正斜杠/,不然会被当成转义字符,导致路径找不到文件——这也可能是隐藏的问题哦。 - 做单元测试的时候,记得用异步测试的写法(比如Jest里用
async/await或者done回调),不然测试会在读取完成前就断言,结果还是不对。
内容的提问来源于stack exchange,提问作者Antona
相关产品推荐
相关产品推荐

