Node.js接收Excel文件转JSON时req.body为空问题求助
解决上传Excel时req.body为空的问题
兄弟,我太懂你作为Node.js新手遇到这个问题的崩溃了——明明选了Excel提交表单,服务器端的req.body却一直是空的!别慌,这问题其实是你没处理对multipart/form-data类型的请求,我给你一步步讲清楚怎么解决:
问题根源
咱们平时用的express自带的解析中间件(比如老版本的body-parser),只能处理application/x-www-form-urlencoded和application/json格式的请求,但文件上传用的是multipart/form-data,这种格式它根本解析不了,所以req.body自然是空的,连文件都接收不到。
解决方案:用multer处理文件上传
multer是专门用来处理multipart/form-data请求的中间件,能帮你解析出文件和普通表单字段,一步到位。
1. 安装必要的包
先在项目里装multer和解析Excel的xlsx库:
npm install multer xlsx
2. 配置服务器端代码
把你的express服务器改成这样,我给你写好注释了:
const express = require('express'); const multer = require('multer'); const xlsx = require('xlsx'); const app = express(); // 用内存存储文件(不用存到硬盘,直接读内容转JSON) const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); // 处理上传请求的路由:upload.single('file')对应前端input的name属性 app.post('/sendFile', upload.single('file'), (req, res) => { // 检查有没有上传文件 if (!req.file) { return res.status(400).send('请选择要上传的Excel文件'); } // 把Excel转成JSON const workbook = xlsx.read(req.file.buffer, { type: 'buffer' }); const firstSheet = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheet]; const jsonData = xlsx.utils.sheet_to_json(worksheet); // 这里可以随便处理jsonData,比如存数据库或者返回给前端 res.json({ success: true, message: '转换成功', data: jsonData }); }); app.listen(3000, () => { console.log('服务器跑起来啦:http://localhost:3000'); });
3. 检查你的HTML代码
注意你的input标签必须有name属性,而且名字要和multer里的upload.single('file')一致(这里是file),比如:
<div class="input-field col s6"> <form name="myForm" action="/sendFile" method="post" enctype="multipart/form-data"> <input id="excelInput" type="file" name="file" accept=".xlsx"> <!-- name属性不能少! --> <button type="submit">提交转换</button> </form> </div>
几个容易踩的坑
- 千万别忘了给form加
enctype="multipart/form-data",你已经加了但还是提醒下,没这个属性浏览器根本不会按文件上传的格式发请求 - input的name属性和multer配置的要完全一致,比如multer写的是
upload.single('excel'),那input的name就得是excel,不然接收不到文件 - 别再用body-parser去解析这个请求了,它处理不了multipart类型的,反而可能搞出问题
内容的提问来源于stack exchange,提问作者MX Orions
相关产品推荐
相关产品推荐

