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
相关产品推荐
相关产品推荐

