Node.js调用csv-parse解析CSV返回undefined问题求助
问题原因
- 你遇到的确实是异步执行逻辑导致的问题:
fs.createReadStream及后续的流事件监听都是异步任务,会在所有同步代码执行完成后才执行。 getValue函数没有为同步执行路径声明返回值,默认返回undefined,所以你调用console.log(mine: ${getValue()})时会先直接打印mine: undefined,等异步的流读取完成触发end事件后,才会执行end回调里的逻辑,打印后续内容。- 你在
end事件的回调函数里写的return,是把值返回给了事件触发的回调上下文,根本不会返回到外层的getValue调用处。
修复方案
你可以把getValue改造成返回Promise的形式,异步获取结果即可,参考代码如下:
const fs = require('fs'); const csvParse = require('csv-parse'); function getValue() { // 用Promise包裹异步逻辑 return new Promise((resolve, reject) => { let results = []; fs.createReadStream('./assets/myCSV.csv') .pipe(csvParse({delimiter: '\n'})) .on('data', (data) => results.push(data)) .on('error', (err => { console.log(`csv-parse error from getValue: ${err}`); reject(err); })) .on('end', () => { console.log('finished!'); let csvLength = results.length; // 生成合法随机下标 let randomNumber = Math.floor(Math.random() * csvLength); let randomCSVLine = results[randomNumber]; console.log(randomCSVLine); resolve(randomCSVLine); }); }) } // 调用时通过then接收异步返回结果 getValue().then(res => { console.log(`mine: ${res}`); })
优化说明
- 你原代码中生成随机数的逻辑有冗余,且原逻辑存在下标越界的风险,直接用数组长度生成随机下标即可
- 数组长度可以直接取
.length属性,不需要转Object.keys再取长度
内容的提问来源于stack exchange,提问作者AugustusCaesar
相关产品推荐
相关产品推荐

