为什么Node.js中CSV转JSON函数返回undefined但内部控制台打印正常
问题根因
这是Node.js异步API的典型表现:
fs.readFile是非阻塞异步方法,你传入的回调函数会在文件读取完成后才执行,而外层的csv_to_json函数不会等待文件读取完成,会直接执行结束。你写在回调里的return jsonData是返回给回调函数本身,不是外层的csv_to_json函数,所以csv_to_json默认返回undefined。
解决方案
方案1:回调函数写法
改写函数支持传入回调参数,读取完成后调用回调传递结果:
var fs = require("fs"); //sorting the json... function compareStrings(a, b) { a = a.toLowerCase(); b = b.toLowerCase(); return (a < b) ? -1 : (a > b) ? 1 : 0; } //reding csv and converting it into json.......... var csv_to_json = (callback)=>{ fs.readFile('./Data/book.csv',(err,data)=>{ // 新增错误处理逻辑 if(err) return callback(err); let jsonData = []; var content = data.toString().split('\n').join().split('\r'); var key = content[0].split(';'); content.shift(); content.forEach((item)=>{ var temp = item.replace(",").split(';'); var data = {} for(var i=0;i<key.length;i++){ data[key[i]] = temp[i] } jsonData.push(data); }) jsonData.sort(function(a, b) { return compareStrings(a.title, b.title); }) // 调用回调传递结果 callback(null, jsonData); }) } // 调用时传入回调获取结果 csv_to_json((err, data) => { if(err) return console.error('读取失败:', err); console.log(data); })
方案2:Promise + async/await写法(更推荐)
用Promise包装异步逻辑,配合async/await写出同步风格的异步代码:
var fs = require("fs").promises; // 直接使用fs的promise版本API //sorting the json... function compareStrings(a, b) { a = a.toLowerCase(); b = b.toLowerCase(); return (a < b) ? -1 : (a > b) ? 1 : 0; } //reding csv and converting it into json.......... var csv_to_json = async ()=>{ const data = await fs.readFile('./Data/book.csv'); let jsonData = []; var content = data.toString().split('\n').join().split('\r'); var key = content[0].split(';'); content.shift(); content.forEach((item)=>{ var temp = item.replace(",").split(';'); var data = {} for(var i=0;i<key.length;i++){ data[key[i]] = temp[i] } jsonData.push(data); }) jsonData.sort(function(a, b) { return compareStrings(a.title, b.title); }) return jsonData; } // 调用方式1:配合立即执行异步函数使用await (async () => { const data = await csv_to_json(); console.log(data); })() // 调用方式2:使用then获取结果 // csv_to_json().then(data => console.log(data)).catch(err => console.error('读取失败:', err))
内容的提问来源于stack exchange,提问作者Markus nuan
相关产品推荐
相关产品推荐

