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

Node.js上传多份大Excel文件触发PayloadTooLargeError求助

问题:上传大数据量Excel触发PayloadTooLargeError及CORS异常

场景说明

基于Node.js Express搭建的服务,上传2份及以上各含约500行数据的Excel文件时,触发PayloadTooLargeError: request entity too large错误;小数据集上传正常,大数据集报错。已尝试通过body-parser配置{ limit: '50mb' }增大请求大小限制,但问题仍存在。同时浏览器控制台提示CORS相关错误。

现有代码结构

server.js

const express = require('express');
const bodyParser = require('body-parser');
const dataProcessingRoutes = require('./routes/dataProcessing');

const app = express();

app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

app.use(dataProcessingRoutes);

app.listen(8081, () => {
  console.log("Listening...");
});

数据处理路由(./routes/dataProcessing.js)

const router = express.Router();
const getPool = require('../utils/db');
const sql = require('mssql');

router.post('/processData', async (req, res) => {
  // 数据处理与插入逻辑...
});

module.exports = router;

前端Dash.js代码

let allData = [];
let processedFilesCount = 0;
acceptedFiles.forEach(file => {
  const reader = new FileReader();
  reader.onload = (e) => {
    const data = e.target.result;
    const workbook = XLSX.read(data, { type: 'binary' });

    const sheetName = workbook.SheetNames[0];
    const sheet = workbook.Sheets[sheetName];
    const dataJson = XLSX.utils.sheet_to_json(sheet);

    allData = [...allData, ...dataJson]; // 合并多文件数据
    processedFilesCount++; // 计数已处理文件
    console.log('allData内容:', allData);
    if (processedFilesCount === acceptedFiles.length) {
        const processedData = allData.map(row => ({
        date: row.DATE,
        responseCode: row['RESPONSE CODE'],
        terminalId: row['TERMINAL ID'],
      }));

      setProcessedData(processedData); 

      console.log('待处理数据:', processedData);
    }
  };

  reader.readAsBinaryString(file);
});
}, []);


const insertIntoDatabase = () => {
  setProcessing(true); // 标记处理中
  console.log('待处理数据:', processedData);
  // 发送数据至后端
  axios.post('http://localhost:8081/processData', { data: processedData })
    .then(response => {
      console.log(response.data);
      setProcessing(false); // 标记处理完成
      setInsertionSuccess(true)
    })
    .catch(error => {
      console.error('发送数据至后端出错:', error);
      setProcessing(false); // 出错时也标记处理完成
    });
};

浏览器控制台错误提示

跨源请求被阻止:同源策略不允许读取位于 http://localhost:8081/processData 的远程资源。原因:缺少 CORS 头 Access-Control-Allow-Origin。状态码:413。

问题根源

  1. 请求体限制配置未生效:Express 4.16+ 内置了express.json()和express.urlencoded()中间件,若同时使用body-parser和内置中间件,可能导致配置冲突;另外,实际请求体大小可能超过50MB,或配置未覆盖Express默认限制。
  2. CORS异常掩盖真实错误:浏览器优先提示CORS头缺失,但状态码413明确指向请求体过大,说明后端已返回413响应,只是因CORS限制,浏览器无法正常解析错误详情。

解决方案

1. 修复Express请求体限制配置

Express 4.16+ 推荐使用内置中间件替代body-parser,确保全局配置生效:

const express = require('express');
const dataProcessingRoutes = require('./routes/dataProcessing');

const app = express();

// 替换body-parser为内置中间件,调大限制值
app.use(express.json({ limit: '100mb' }));
app.use(express.urlencoded({ limit: '100mb', extended: true }));

app.use(dataProcessingRoutes);

app.listen(8081, () => {
  console.log("Listening...");
});

若坚持使用body-parser,需确保中间件在路由前加载,且无重复配置。

2. 解决CORS问题

安装并配置cors中间件,确保后端返回正确的CORS响应头:

  • 安装依赖:
npm install cors
  • 在server.js中配置:
const express = require('express');
const cors = require('cors');
const dataProcessingRoutes = require('./routes/dataProcessing');

const app = express();

// 优先配置CORS,确保所有请求都能获取到CORS头
app.use(cors());

// 配置请求体限制
app.use(express.json({ limit: '100mb' }));
app.use(express.urlencoded({ limit: '100mb', extended: true }));

app.use(dataProcessingRoutes);

app.listen(8081, () => {
  console.log("Listening...");
});

配置后,浏览器可正常接收后端返回的错误信息,便于排查真实问题。

3. 验证请求体实际大小

在后端路由中添加日志,确认请求体是否超过设置的限制:

router.post('/processData', async (req, res) => {
  const bodySize = Buffer.byteLength(JSON.stringify(req.body), 'utf8');
  console.log('请求体大小(字节):', bodySize);
  console.log('请求体大小(MB):', (bodySize / (1024 * 1024)).toFixed(2));
  // 后续数据处理逻辑...
});

若实际大小超过设置值,需进一步调大limit参数。

4. 优化数据传输(可选)

若数据量过大,可考虑分批次上传,或在前端对JSON数据进行gzip压缩后发送,后端解压处理,减少请求体体积。


内容的提问来源于stack exchange,提问作者miss-chl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:48:13