【发布时间】:2021-04-10 17:56:30
【问题描述】:
使用 React/Redux 前端和我自己的 nodejs/express api 处理登录表单/注销按钮。登录表单有问题。大多数时候它工作得很好,但我经常犯错误。第一个错误是forbidden,它告诉我在发送userDetails 请求之前,用户还没有完全通过身份验证。
还有一个 bug,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不可等待。 -
您应该考虑改用 TypeScript,因为了解类型(“形状”)并知道什么是可等待的,什么不是可以让编写现代 JavaScript 变得更加容易。
标签: javascript async-await react-redux