前端登录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
相关产品推荐
相关产品推荐

