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

Express文件上传请求均返回400错误排查求助

解决Express中multipart/form-data请求返回400 Bad Request的问题

我之前也碰到过类似的问题,核心原因其实出在前端手动设置multipart/form-data请求头这一步上,导致后端的解析中间件根本没法正确识别请求内容。

问题到底出在哪?

当你用FormData作为fetch的请求体时,浏览器会自动帮你生成正确的Content-Type头,里面会包含一个关键的boundary参数(比如multipart/form-data; boundary=----WebKitFormBoundaryabc123),这个boundary是用来分隔表单里不同字段的标识。但你现在的代码里不管什么请求都手动设置Content-Type,当上传文件时,就会把浏览器自动生成的带boundary的头给覆盖掉——后端的busboy-body-parser找不到这个boundary,自然没法解析请求,直接返回400错误。

怎么改?

只需要在你的request方法里加个判断,当请求类型是文件上传(也就是contentTypes.file)时,不要手动设置Content-Type,让浏览器自己处理:

async request(method, endpoint, body, contentType=contentTypes.json) {
  const { authToken } = this;
  const endpointUrl = this.getEndpointUrl(endpoint);
  const headers = new Headers();
  if(authToken) { headers.append(authTokenHeader, authToken); }
  headers.append('Accept', 'application/json, application/xml, text/plain, text/html, *.*');
  
  // 只有非文件上传的请求,才手动设置Content-Type
  if (contentType !== contentTypes.file) {
    headers.append('Content-Type', contentType);
  }

  const response = await fetch(endpointUrl, {
    method: method,
    headers: headers,
    body: this._serializeRequestBody(body, contentType),
  });
  
  // 下面的_parseResponse等逻辑保持不变
  const result = await this._parseResponse(response);
  if(!response.ok) {
    if(response.status === 401) { this.revokeAuth(); }
    throw result || new Error('Unknown error (no error in server response)');
  } else if(result && result.authToken) {
    this.setAuthToken(result.authToken);
  }
  return result;
}

额外的几个检查点

  1. 中间件顺序优化:虽然这不是你当前的问题,但建议把busboy-body-parser放在bodyParser系列中间件前面,避免潜在的解析冲突:
// 先处理multipart表单数据(文件上传)
app.use(busboyBodyParser()); 
// 再处理JSON和普通表单数据
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
  1. 确认File对象有效:在调用postFile的时候,确保传入的file是一个标准的浏览器File对象,可以在调用前打印一下:
// 比如在调用postFile的地方加个日志
console.log('上传的文件:', file);
// 确认输出里有name、size、type这些属性
  1. 后端路由调试:可以在你的上传路由里临时加个日志,看看解析后的内容:
app.post('/your-upload-endpoint', (req, res) => {
  console.log('解析后的body:', req.body);
  console.log('解析后的文件:', req.files); // busboy-body-parser会把文件存在req.files里
  // 后续处理逻辑...
});

按照这个修改后,前端发送的multipart请求就会带有正确的boundary,后端就能正常解析文件了,400错误应该就会消失。

内容的提问来源于stack exchange,提问作者SimpleJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:48:37