我正在使用React/Redux前端和自己的nodejs/express api开发登录表单/注销按钮。但是在处理登录表单时遇到了问题。大部分情况下它能正常工作,但是经常会出现错误。第一个错误是forbidden
,这告诉我在发送userDetails
请求之前用户没有通过身份验证。
还有另一个问题,Redux没有更改用户角色,我需要动态呈现导航菜单。我认为将handleLogin转换为async/await可能是解决方案,但我觉得我做得不对。
import React from 'react';
import { login, userDetails } from '../axios/homeApi';
import { useForm } from 'react-hook-form';
import { useDispatch } from 'react-redux';
import { setLogin, setRole } from '../redux/actions';
const LoginForm = () => {
const { handleSubmit, register, errors } = useForm();
const dispatch = useDispatch();
const handleLogin = values => {
login(values.email, values.password)
.then(res => {
const token = res.data.token;
window.localStorage.setItem('auth', token);
dispatch(setLogin({ loggedIn: true }));
userDetails()
.then(res => {
const role = res.data.data.role;
dispatch (setRole({ role }));
})
})
}
return (
<div>
<form action="" onSubmit={handleSubmit(handleLogin)} className="footer-form">
<input
type="email"
placeholder="Enter Email Here"
name="email"
ref={register({ required: "Required Field" })}
/>
<input
type="password"
placeholder="Enter Password Here"
name="password"
ref={register({
required: "Required Field",
minLength: { value: 6, message: "Minimum Length: 6 Characters" }
})}
/>
{errors.password && errors.password.message}
{errors.email && errors.email.message}
<input type="submit" value="Login" />
</form>
</div>
)
}
export default LoginForm;
这是我尝试将handleLogin转换为async/await的最佳方法。我正在尝试理解如何从这些调用中获取数据。
const handleLogin = async values => {
try {
const {data: {token}} = await login(values.email, values.password)
window.localStorage.setItem('auth', token);
console.log(token);
const user = await userDetails();
await dispatch(setLogin({ loggedIn: true}))
await dispatch(setRole(user.data.data.role))
} catch(err) {
console.log(err)
}
}
非常感谢您提供的任何帮助和指导。
dispatch
不可等待。 - Dai