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

Express中带application/json头的空POST请求报错解决

Express空JSON请求解析错误及修复方案

错误原因拆解

  1. SyntaxError: Unexpected end of JSON input
    当请求头携带application/json但请求体为空时,express.json()中间件会尝试解析空字符串,而JSON.parse('')本身就会抛出语法错误——空内容不属于合法JSON格式。

  2. TypeError: Cannot convert undefined or null to object
    JSON解析失败时,req.body不会被初始化,仍为undefined。直接调用Object.keys(req.body)会触发类型错误,因为Object.keys()不支持接收undefined或null作为参数。

解决办法

方法1:全局配置宽松模式解析

修改express.json()的配置,开启strict: false,让中间件将空请求体解析为空对象{},避免抛出错误:

// 替换原有的app.use(express.json())
app.use(express.json({ strict: false }));

之后再用Object.keys(req.body).length === 0判断空请求就不会报错,因为req.body已被初始化为合法的空对象。

方法2:捕获解析错误并手动初始化req.body

如果不想修改全局配置,可以添加一个错误处理中间件,专门捕获JSON解析错误,然后手动将req.body设为空对象:

// 该中间件需放在express.json()之后
app.use((err, req, res, next) => {
  // 判断是否为JSON解析导致的400错误
  if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
    req.body = {}; // 手动初始化空对象
    return next(); // 继续执行后续路由逻辑
  }
  next(err); // 其他错误交给默认错误处理流程
});

在路由中判断空请求时,先确保req.body存在:

app.post('/your-endpoint', (req, res) => {
  // 先检查req.body是否存在,再判断是否为空对象
  if (!req.body || Object.keys(req.body).length === 0) {
    return res.status(400).send('请求体不能为空');
  }
  // 正常业务逻辑处理
  res.send('请求处理完成');
});

或者用更简洁的写法,给req.body设置默认空对象:

if (Object.keys(req.body || {}).length === 0) {
  // 空请求处理逻辑
}

内容的提问来源于stack exchange,提问作者Emil Alejandro Martinez Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:02:10