React用户登录token校验:调用isAuthorized返回Promise而非布尔值问题
问题根因
- 所有用
async关键字声明的函数,返回值默认会被包装为Promise对象,这是JavaScript的固定语法规则。你的AuthService.isAuthorized方法用了async修饰,所以直接调用拿到的一定是Promise实例,不是你代码里return的布尔值。 - 你在useEffect里没有等待异步执行完成就直接判断变量值,此时
isAuthorized是Promise实例(属于JS真值),所以if (isAuthorized)判断永远为真,还会把Promise对象错误赋值给isLoggedIn状态。
修复方案
修改组件内的useEffect逻辑,处理异步结果即可,有两种常用写法:
写法1:用.then处理Promise结果
useEffect(() => { AuthService.isAuthorized().then(isAuthorized => { setIsLoggedIn(isAuthorized); }) }, []);
写法2:在useEffect内声明异步函数执行
useEffect(() => { const checkAuthStatus = async () => { const isAuthorized = await AuthService.isAuthorized(); setIsLoggedIn(isAuthorized); }; checkAuthStatus(); }, []);
可选优化:完善AuthService的异常兜底
你当前的isTokenValid方法只处理了请求成功状态码200、请求失败状态码403的场景,如果出现网络错误、其他状态码的情况,方法会返回undefined,建议补充兜底逻辑:
private static isTokenValid = async (token: string | null) => { return await axios.post('https://example.net/wp-json/jwt-auth/v1/token/validate', null, { headers: { 'Authorization': `Bearer ${token}` } }).then(res => { return res.data.status === 200; }).catch(e => { return e.response?.status === 403 ? false : false; }); }
内容的提问来源于stack exchange,提问作者Влад
相关产品推荐
相关产品推荐

