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

登录接口请求异常:JSON对象被当作属性键传入问题排查

问题原因与解决方案

嘿,这个问题我太熟悉了!根源就在于请求头声明的格式和实际发送的数据格式不匹配,导致后端解析出错。

为什么会出现这种情况?

你前端代码里设置了请求头:

request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")

这个头明确告诉后端:“我发送的是key=value&key2=value2这种表单格式的数据”。但实际上你传给后端的是JSON字符串:

request.send(JSON.stringify(dataToSend))

后端按照表单格式去解析这个JSON字符串时,会把整个JSON内容当成一个属性键,值默认为空,于是就出现了你看到的{ '{"email":"james@oxido.co.uk","password":"test"}': '' }这种奇怪结构。

两种修复方案任选其一

方案1:改用JSON格式发送请求(推荐)

既然你本来就想传递JSON结构的数据,那就把请求头改成对应格式,同时保持发送JSON字符串的逻辑:

  1. 修改请求头配置:
request.setRequestHeader("Content-Type", "application/json")
  1. 确保后端已经配置了解析JSON请求体的中间件(比如Express框架下需要添加app.use(express.json())),这样后端的req.body就能正确解析成你预期的{email: "...", password: "..."}对象了。

方案2:按照表单格式构造数据

如果你想保留application/x-www-form-urlencoded的请求头,那就要把数据转换成表单要求的键值对格式:

// 替换原来的dataToSend构造和send逻辑
let dataToSend = new URLSearchParams();
dataToSend.append('email', email);
dataToSend.append('password', password);
request.send(dataToSend);

这样后端就能正常解析出符合预期的键值对结构了。

验证建议

修改完成后,可以在前端console里打印发送的数据,后端再打印req.body,确认格式是否匹配预期~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:48:24