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

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,提问作者Влад

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:09:00