如何将Excel转换生成的JSON作为响应返回至自有Express服务器
问题根因
- 原有POST上传接口中,Excel转换完成后未执行响应操作,转换得到的结果未返回给客户端
- 自定义xlsx转换逻辑与引入的
convert-excel-to-json功能重复,且自带落地写JSON文件的逻辑,不符合直接返回数据的需求 - 预设的
/json路由存在语法错误,且响应头配置错误:返回JSON数据无需设置text/html类型,Express内置的res.json()方法会自动处理正确的Content-Type - 原有逻辑先将上传的Excel存到本地磁盘再读取转换,可直接读取上传文件的内存缓冲区完成转换,无需落地Excel文件,效率更高
实现步骤
- 安装所需依赖
npm i express express-fileupload xlsx
- 替换服务端核心代码,全程内存处理,不生成落地JSON文件
const express = require('express'); const server = express(); const upload = require('express-fileupload'); const xlsx = require('xlsx'); // 内存缓存最近一次转换的JSON结果,供/json路由调用 let latestConvertResult = null; server.use(upload()); // 首页返回上传页面 server.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); // Excel上传转换接口 server.post('/', (req, res) => { if (!req.files?.filename) { return res.status(400).send('未检测到上传的文件'); } const uploadFile = req.files.filename; try { // 直接读取上传文件的内存缓冲区解析Excel,无需存到本地磁盘 const workbook = xlsx.read(uploadFile.data, { type: 'buffer' }); const parseResult = {}; // 遍历所有工作表转JSON结构 workbook.SheetNames.forEach(sheetName => { parseResult[sheetName] = xlsx.utils.sheet_to_json(workbook.Sheets[sheetName]); }); // 缓存转换结果 latestConvertResult = parseResult; // 上传接口可直接返回结果 res.json(parseResult); } catch (err) { console.error('Excel解析失败:', err); res.status(500).send('文件解析失败'); } }); // 独立/json路由,返回最近一次转换完成的JSON数据 server.get('/json', (req, res) => { if (!latestConvertResult) { return res.status(404).send('暂无转换结果,请先上传Excel文件'); } // 自动设置JSON响应头,序列化结果返回 res.json(latestConvertResult); }); server.listen(9000, () => { console.log('服务启动成功,监听9000端口'); });
可选调整
- 如果需要保留上传Excel存到本地的逻辑,只需要恢复
file.mv逻辑,将xlsx.read的入参改为本地存储的文件路径即可,转换完成后直接返回结果,不要调用fs写JSON文件 - 如果只需要解析第一个工作表的数据,替换遍历SheetNames的逻辑即可:
const firstSheet = workbook.Sheets[workbook.SheetNames[0]]; latestConvertResult = xlsx.utils.sheet_to_json(firstSheet);
- 如果坚持用
convert-excel-to-json库做转换,只需要把xlsx解析部分替换为原有importExcel调用,拿到result后直接通过res.json(result)返回即可,不要执行写文件操作
内容的提问来源于stack exchange,提问作者Cloud Smasher
相关产品推荐
相关产品推荐

