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

Express框架下访问req.body的token字段返回undefined的解决方案

问题根因

你看到req.body是{ '{"token":"eyJ...c9g"}': '' }、读req.body.token返回undefined,本质是前端发送请求时的格式和服务端解析器的匹配规则不对应,不是中间件失效的问题。

具体的错位逻辑

原生XHR发送数据时,如果不手动设置Content-Type请求头,会默认用text/plain;charset=UTF-8的格式传内容:

  • 你之前写的xhr.send(JSON.stringify({ token: id_token })),相当于直接把JSON字符串以纯文本格式发出去。服务端的express.json()中间件只解析Content-Type为application/json的请求,express.urlencoded()中间件只解析Content-Type为application/x-www-form-urlencoded的请求,两个解析器都没法识别纯文本格式的JSON串
  • 最后Express只能把整个传入的JSON字符串当成一个没有对应值的表单键,塞进req.body,就出现了键是完整JSON串、值是空字符串的奇怪结构,自然读不到.token属性

调整表单参数后能正常取值的原因

你后来改用xhr.send('idtoken=' + id_token)发送的是键值对格式的字符串,XHR在这种场景下默认会把请求头设成application/x-www-form-urlencoded,刚好匹配express.urlencoded()的解析规则,中间件会自动把字符串拆成键值对挂到req.body上,所以能通过req.body.idtoken正常拿到令牌值。

两种可落地的修正写法

  • 如果你想保留JSON格式传参的逻辑,前端发送请求前需要手动补请求头:xhr.setRequestHeader('Content-Type', 'application/json'),这样express.json()中间件就能正常解析JSON串,直接通过req.body.token读取令牌即可
  • 如果你不想额外写请求头,可以保持现在表单键值对的发送逻辑,和当前服务端的解析配置完全适配,不需要额外改动代码

补充说明:你之前查到的实现需要依赖body-parser是老版本Express的情况,Express 4.16之后已经把body-parser的常用解析能力内置成了express.json()和express.urlencoded()两个方法。你代码里引入的body-parser模块没有通过app.use()挂载到中间件链上,本身不会产生任何解析作用,实际生效的就是Express内置的两个解析能力,不需要额外引入body-parser模块也能完成正常解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 08:54:06