Express中带application/json头的空POST请求报错解决
Express空JSON请求解析错误及修复方案
错误原因拆解
SyntaxError: Unexpected end of JSON input
当请求头携带application/json但请求体为空时,express.json()中间件会尝试解析空字符串,而JSON.parse('')本身就会抛出语法错误——空内容不属于合法JSON格式。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
相关产品推荐
相关产品推荐

