Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React.js从AWS读取用户信息并设置变量状态_Javascript_Reactjs_Amazon Web Services_Amazon Cognito - Fatal编程技术网

Javascript React.js从AWS读取用户信息并设置变量状态

Javascript React.js从AWS读取用户信息并设置变量状态,javascript,reactjs,amazon-web-services,amazon-cognito,Javascript,Reactjs,Amazon Web Services,Amazon Cognito,如果自定义属性等于1,我想读取用户信息并将“Admin”变量设置为yes。 问题是,当我想读取用户属性时,程序会崩溃,出现TypeError:无法读取未定义属性的“attributes” 这是我的代码: import React, { useState, useEffect } from "react"; import './App.css'; import { Link, withRouter } from "react-router-dom"; import { Nav, Navbar, N

如果自定义属性等于1,我想读取用户信息并将“Admin”变量设置为yes。 问题是,当我想读取用户属性时,程序会崩溃,出现TypeError:无法读取未定义属性的“attributes”

这是我的代码:

import React, { useState, useEffect } from "react";
import './App.css';
import { Link, withRouter } from "react-router-dom";
import { Nav, Navbar, NavItem, Image } from "react-bootstrap";
import { LinkContainer } from "react-router-bootstrap";
import Routes from "./Routes";
import { Auth } from "aws-amplify";
import logo from './img/download.svg';


function App(props) {
    const [isAuthenticating, setIsAuthenticating] = useState(true);
    const [isAuthenticated, userHasAuthenticated] = useState(false);
    const [userData, setUserData] = useState([]);
    const [isAdmin, setIsAdmin] = useState(true);

    useEffect(() => {
      onLoad();
    }, [],);

    async function handleLogout() {
      await Auth.signOut();
      userHasAuthenticated(false);
      setIsAdmin(false);
      props.history.push("/login");
    }

    async function onLoad() {
      try {
        await Auth.currentSession();
        userHasAuthenticated(true);
        await Auth.currentUserInfo().then(user => setUserData(user));
        if (userData.attributes['custom:isAdmin'] === "1" ) {
          setIsAdmin(true)
        }
      }
      catch(e) {
        if (e !== 'No current user') {
        alert(e);
      }
    }

    setIsAuthenticating(false);
  }

return (...)

您好,在
wait
函数中,您似乎在
内部设置
userData
的值,然后在
外部访问
userData.attributes

因此,当您检查
userData.attributes
时,可能因为用户数据是
异步的,所以用户数据没有被填充,而不是在
中设置它,然后
您可以使用
wait
将响应分配为新变量,这样当
异步的
代码被执行时,它将只执行下一个代码切

const user = await Auth.currentUserInfo();

if(user.attributes['custom:isAdmin'] === "1" ) {
  setUserData(user);
  setIsAdmin(true);
}

我猜这是因为setUserData()[基本上是setState()]是一个异步函数,并且如果块在设置(更新)状态之前执行

尝试使用setTimeout()


您好,谢谢您的回答。遗憾的是,此解决方案似乎都不起作用,setTimeout延迟出现了相同的错误。我不知道为什么会发生这种情况,因为我在另一个组件中有相同的指令,并且userData.attributes读取正确。非常感谢。这就是我问题的答案。
await Auth.currentUserInfo().then(user => setUserData(user));
    setTimeout(()=>{
       if(userData.attributes['custom:isAdmin'] === "1" ) {setIsAdmin(true)}
     },0)