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

Express中POST方法无法接收请求体、报400错误的问题求助

解决Express POST请求收空对象/400错误的方案

针对你遇到的POST请求问题,按以下步骤排查解决:

1. 确保请求体是合法JSON格式

Thunder Client报400错误,大概率是发送的JSON存在语法问题:

  • 必须用双引号包裹键名和字符串值,不能用单引号
  • 禁止尾部逗号(比如{"name": "test",}这种格式JSON不允许)
  • 嵌套结构也要严格符合JSON规范

2. 正确设置请求头与.http文件格式

如果用.http文件测试,必须严格遵循格式要求:

POST /你的路由路径(比如/stories)
Content-Type: application/json

{
  "title": "测试书籍",
  "author": "测试作者"
}

注意:请求头和请求体之间必须有一个空行,这是http文件识别请求体的关键,缺失空行会导致Content-Type设置无效,请求体无法被解析。

3. 确认路由挂载与中间件顺序

  • 检查主应用中是否正确挂载了routerStories:
    // 主app.js示例
    const routerStories = require('./path/to/routerStories');
    app.use('/stories', routerStories); // 确保挂载路径与请求路径匹配
    
  • 你代码中routerStories.use(express.json());的顺序是正确的(在POST路由之前),但如果主应用中存在修改req.body的中间件,需要确认不会覆盖JSON解析逻辑。

4. 调试排查与优化代码

在POST路由中添加调试代码,确认请求状态:

routerStories.post('/', (req, res) => {
  console.log('请求Content-Type:', req.headers['content-type']);
  console.log('解析后的请求体:', req.body);
  
  if (!req.body) {
    return res.status(400).send('无效的JSON请求体');
  }
  
  const newBook = req.body;
  stories.push(newBook);
  res.json(stories); // 建议用res.json()代替手动字符串化,自动设置响应Content-Type
});

使用res.json()比res.send(JSON.stringify())更稳妥,它会自动处理响应头的Content-Type设置。

5. Thunder Client测试注意事项

  • 在Thunder Client的Headers标签下明确添加Content-Type: application/json
  • 在Body标签下选择JSON格式,再输入合法的JSON内容,避免用Raw格式手动编写导致的识别错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:10:17