Javascript React.js从AWS读取用户信息并设置变量状态
如果自定义属性等于1,我想读取用户信息并将“Admin”变量设置为yes。 问题是,当我想读取用户属性时,程序会崩溃,出现TypeError:无法读取未定义属性的“attributes” 这是我的代码: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
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)