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

Express应用仅Windows正常返回JSON,Debian/Heroku返回空数组如何解决

问题根因

  • 换行符硬编码不兼容跨平台:Windows系统文本文件换行符是\r\n,Linux/类Unix系统换行符是\n,你的代码中写死了针对\r的拆分、删除首字符逻辑,在Linux环境下执行时CSV内容解析完全错误,最终生成空数组。
  • CSV解析逻辑冗余错误:你先把读取到的内容按\n拆分得到数组,又直接把数组转成字符串再按\r拆分,这个逻辑本身不符合CSV解析规范,会丢失正常内容。
  • 潜在异步初始化风险:模块初始化时异步读取CSV文件给returnJSON赋值,若服务启动后立刻收到请求,可能returnJSON还未完成赋值,你遇到的空数组问题主要由前两点导致。

修复方案

1. 核心优化逻辑

用正则/\r?\n/匹配拆分换行,兼容全平台换行规则,同时过滤空行避免无效内容干扰。

2. 路径适配优化

用path模块拼接绝对路径,避免不同工作目录下相对路径找不到文件的问题。

修复后完整代码

var express = require('express');
var router = express.Router();
var fs = require('fs');
var path = require('path');

// 用绝对路径避免不同工作目录下找不到文件
const CSV_PATH = path.join(__dirname, './data/todoList.csv');
const JSON_PATH = path.join(__dirname, './data/todo.json');

//读取CSV文件
function readCSV(callback) {
  fs.readFile(CSV_PATH, 'utf8', function(err, data) {
    if(err) throw err;
    // 按跨平台换行符拆分,同时过滤空行
    var rows = data.split(/\r?\n/).filter(row => row.trim() !== '');
    var temp = convertToJSON(rows);
    fs.writeFileSync(JSON_PATH, JSON.stringify(temp, null, 4));
    return callback(temp);
  });
}

//数组转JSON
function convertToJSON(rows) {
  var asJSON = [];
  // 读取表头
  var headers = rows[0].split(",");
  
  for (var i=1; i<rows.length; i++) {
    var obj = {}
    var currentRow = rows[i].split(",");

    for (var j=0; j<headers.length; j++) {
      obj[headers[j]] = currentRow[j];
    }
    asJSON.push(obj);
  }
  return asJSON;
}

var returnJSON;
// 同步初始化读取,确保服务启动时数据已加载完成
try {
  const data = fs.readFileSync(CSV_PATH, 'utf8');
  const rows = data.split(/\r?\n/).filter(row => row.trim() !== '');
  returnJSON = convertToJSON(rows);
} catch (err) {
  throw new Error('初始化CSV数据失败:' + err.message);
}

router.get('/', function (req, res, next) {
  res.json(returnJSON);
});

module.exports = router;

内容的提问来源于stack exchange,提问作者Jostal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:09:03