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

前端登录REST API创建的账号失败(Postman可正常登录),遇ERR_HTTP_HEADERS_SENT及401错误求助

前端登录REST API创建的账号失败(Postman可正常登录),遇ERR_HTTP_HEADERS_SENT及401错误求助

Hey,我帮你梳理下这两个问题的根源,都是前后端对接时很容易踩的小细节坑,别着急:


1. 后端 ERR_HTTP_HEADERS_SENT 错误的原因及修复

这个错误本质是你给客户端重复发送了HTTP响应。看你的登录路由代码:

!user && res.status(401).json("Wrong Credentials!")
// ... 后面还有密码校验、返回200响应的代码

当用户不存在时,你发送了401响应,但没有终止函数执行,代码会继续往下跑,后面又会尝试发送200的响应,Node.js就会报错说“不能在发送响应后再设置响应头”。

修复方法:给每个错误响应加上return,终止后续代码执行:

router.post("/login", async (req,res)=>{
try{
const user = await User.findOne({username: req.body.username});

// 改成if判断+return,终止后续代码
if (!user) {
  return res.status(401).json("Wrong Credentials!");
}

const hashedPassword = CryptoJS.AES.decrypt(
user.password,
process.env.PASS_SEC
);

const OriginalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);

// 密码不匹配的判断也要加return
if (OriginalPassword !== req.body.password) {
  return res.status(401).json("Wrong Credentials!");
}

const accessToken = jwt.sign({
id:user._id,
isAdmin: user.isAdmin,
},process.env.JWT_SEC,{expiresIn:"3d"}
);

const {password, ...others} = user._doc;

res.status(200).json({...others, accessToken});

}catch(err){
res.status(500).json(err)
}});

2. 前端401 "Wrong Credentials!" 的原因及修复

这个是因为前端传参的字段名和后端不匹配!

  • 后端接收的是 req.body.username(字段名是username)
  • 但你的Login组件里,state变量是userName,调用login时传的是{userName,password},所以后端拿到的请求体里是userName字段,不是username,自然找不到用户,返回401。
  • 而Postman能成功,肯定是你在Postman里传的是正确的username字段对吧?

修复方法(二选一即可):

方法一:统一字段名(推荐)

把前端的state变量改成username,保持和后端一致:

// Login组件里的state修改
const[username,setUsername] = useState("");

// Input的onChange对应修改
<Input placeholder="username"
onChange={(e)=>setUsername(e.target.value)}/>

// 调用login时传参
login(dispatch,{username,password})

方法二:传参时手动映射字段

如果不想改变量名,就在传参的时候把userName映射成username:

const handleClick = (e) =>{
e.preventDefault()
login(dispatch,{username: userName,password}) // 手动映射字段名
}

额外小问题(不影响登录,但建议修复)

你的userRequest里的配置写错了,header应该是复数headers:

export const userRequest = axios.create({
  baseURL: BASE_URL,
  headers: {token: `Bearer ${TOKEN}`} // 这里改成headers
})

按上面的步骤修改后,应该就能正常登录啦!

备注:内容来源于stack exchange,提问作者Manoj Mondal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:29:09