You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:24:07