【问题标题】:axios get request not working inside useEffectaxios 获取请求在 useEffect 中不起作用
【发布时间】:2021-09-06 12:54:03
【问题描述】:

我正在使用 axios get request 来检查用户是否使用 jwt 登录,但是,当应用程序启动时,它一直显示加载状态,如果在应用程序第一次启动时它设置为 true,那么它应该发出 get 请求并验证用户,然后将加载状态设置为 false 并导航到特定路线。我得到的是加载状态始终为真,请求不发送到后端服务器。

这里是检查用户是否登录的功能:

 useEffect(() => {
        
        const checkLoggedIn = async () => {
            const Token = await AsyncStorage.getItem('Token');

            if (Token) {
                axios.get('http://localhost:3000/isUserAuth', {
                    headers: {
                        'x-access-token': Token
                    }
                }).then((res) => {
                 
                    setUser(res.data.user)
                    AsyncStorage.setItem("Token", res.token);
                    setIsLoading(false);

                }).catch((error) => {
                    console.log(error)
                    setIsLoading(false);
                });

            } else {
                setUser(null);
                setIsLoading(false)
            }
        }

        checkLoggedIn();

    }, []);

这是后端:

app.get('/isUserAuth', verifyJWT, (req, res) => {
  const token = req.headers['x-access-token'];
  let sqlCheck = `SELECT * FROM users where id =?`;
  CON.query(sqlCheck, req.user, (err, user) => {

    if (user) {
      console.log(user)
      return res.status(400).json({ auth: true, user: user, Token: token })
    }
  })
})

希望有人帮助我找出问题所在。谢谢

【问题讨论】:

    标签: javascript react-native express jwt


    【解决方案1】:

    //我找到了解决办法

    问题出在user 返回undefined 的后端服务器上,而我犯的错误是只检查if(user) 并没有设置else,它没有回复font-end,这表明状态保持真实 所以后端代码应该是这样的:

     CON.query(sqlCheck, req.user, (err, user) => {
        
            if (user) {
             
              return res.status(200).json({ auth: true, user: user, Token: token })
            }else{ return res.status(400).json({ auth: false, user: null })}
          })
    

    【讨论】:

      【解决方案2】:

      当组件挂载时 setIsLoading 为 true,然后根据其值运行 async/await 呢?

      useEffect(() => {
       setIsLoading(false);
       if (!setIsLoading) {
        try {
         // fetch code 
        } catch(e) {
          //some error handling 
        } finally {
         // something to do whatever the outcome
        }
       }
      })
      

      【讨论】:

      • 基于上面@Ross 的回答,我检查了代码,实际上问题在于请求本身而不是加载状态。
      【解决方案3】:

      如果您的加载状态未更改为 false,则表明您的数据库调用没有问题,因为即使您的调用失败,else 也应该触发并仍将加载设置为 false

      可能会考虑缩小功能复杂性并从那里开始构建。可能类似于以下内容以确保您的加载状态正确更新:

      useEffect(() => {
        const checkLoggedIn = async () => {
          setUser(null);
          setIsLoading(false)
        }
      
        checkLoggedIn();
      }, []);
      
      

      【讨论】:

      • 我已经一步步检查了,发现问题出现在}).then((res) => {之后,这意味着服务器要么没有回复,要么没有发送请求。从前端,我检查了 fetch 而不是 axios 但同样的问题
      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 2021-02-26
      • 2019-12-19
      • 2018-05-20
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多