使用Node.js+Multer上传Excel至MySQL,无法打印文件数据
问题描述
使用Node.js结合Multer实现Excel文件上传并导入MySQL时,文件已成功保存至指定文件夹,但无法通过console.log输出Excel文件中的数据。相关代码如下:
前端代码(App.jsx)
const App = () => { const [file, setFile] = useState(); const upload = async () => { const formData = new FormData(); formData.append("file", file); try { const res = await axios.post("http://localhost:4000/api/uploadLibrary", formData); console.log(res) } catch (error) { console.log(error) } }; return ( <div> <input type="file" onChange={(e) => setFile(e.target.files[0])} /> <button type="button" onClick={upload}> Upload </button> </div> ); }; export default App;
后端入口文件(index.js)
import express from 'express' import cors from 'cors' import uploadUserLibrary from './routes/uploadUserLibrary.js' const app = express() app.use(express.json()) app.use(cors()) app.use('/api/uploadLibrary', uploadUserLibrary ) app.listen(4000, () => { console.log(`conntected to backend on port http://localhost:${4000}`) })
上传路由文件(uploadLibrary.js)
const router = express.Router(); const storage = multer.diskStorage({ destination: function (req, file, cb) { return cb(null, "./public/files"); }, filename: function (req, file, cb) { return cb(null, `${Date.now()}_${file.originalname}`); }, }); const upload = multer({ storage }); router.post("/", upload.single("file"), async (req, res) => { let fileInfo = req.file try { const workbook = XLSX.readFile(fileInfo); const sheetName = workbook.SheetNames[0]; const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]); console.log(data) } catch (error) {} }); export default router;
解决方案
问题集中在uploadLibrary.js的几个关键错误上,修正如下:
- 补充缺失的模块导入:需要导入
express、multer和xlsx(处理Excel的核心库),否则会出现未定义报错。 - 修正文件读取路径:
XLSX.readFile需要传入文件的完整路径,而非req.file对象,应使用req.file.path获取保存后的文件路径。 - 添加错误排查日志:catch块中需打印错误信息,方便定位读取失败的原因。
- 补充接口响应:必须给前端返回响应,避免请求长期处于pending状态。
修正后的uploadLibrary.js代码:
import express from 'express'; import multer from 'multer'; import XLSX from 'xlsx'; const router = express.Router(); const storage = multer.diskStorage({ destination: function (req, file, cb) { return cb(null, "./public/files"); }, filename: function (req, file, cb) { return cb(null, `${Date.now()}_${file.originalname}`); }, }); const upload = multer({ storage }); router.post("/", upload.single("file"), async (req, res) => { try { if (!req.file) { return res.status(400).json({ message: '未上传有效文件' }); } // 使用文件完整路径读取Excel const workbook = XLSX.readFile(req.file.path); const sheetName = workbook.SheetNames[0]; const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]); console.log(data); res.status(200).json({ data, message: '文件读取成功' }); } catch (error) { console.error('Excel读取失败:', error); res.status(500).json({ message: '文件读取失败', error: error.message }); } }); export default router;
内容的提问来源于stack exchange,提问作者Stykgwar
相关产品推荐
相关产品推荐

