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

使用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的几个关键错误上,修正如下:

  1. 补充缺失的模块导入:需要导入express、multer和xlsx(处理Excel的核心库),否则会出现未定义报错。
  2. 修正文件读取路径:XLSX.readFile需要传入文件的完整路径,而非req.file对象,应使用req.file.path获取保存后的文件路径。
  3. 添加错误排查日志:catch块中需打印错误信息,方便定位读取失败的原因。
  4. 补充接口响应:必须给前端返回响应,避免请求长期处于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:43:28