#javascript #reactjs #firebase #firebase-authentication
#javascript #reactjs #firebase #firebase-аутентификация
Вопрос:
Я работаю над приложением ReactJS и интегрировал аутентификацию Firebase для функций создания пользователя и входа в систему. У меня возникли проблемы с выяснением, как установить DisplayName, потому что каждая учетная запись, которую я создаю, имеет DisplayName «null». Это моя функция для создания учетной записи пользователя. Я тщательно изучил документацию Firebase и смог узнать только, как получить DisplayName, но не как его установить?
function CreateUser({ setUserInformation, setErrors, setLoggedIn }) {
const signUpUser = useCallback(
(e) => {
e.preventDefault();
const email = e.currentTarget.email.value;
const password = e.currentTarget.password.value;
const displayName = e.currentTarget.displayName.value;
// const displayName = document.getElementById("name").value;
const auth = getAuth();
createUserWithEmailAndPassword(auth, email, password)
.then((userCredential) => {
// Signed in
const user = userCredential.user;
setLoggedIn(true);
setUserInformation({
email: user.email,
displayName: user.displayName,
uid: user.uid,
accessToken: user.accessToken,
});
setErrors();
})
.catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
console.warn({ error, errorCode, errorMessage });
setErrors(errorMessage);
});
},
[setErrors, setLoggedIn, setUserInformation]
);
Мой App.js:
function App() {
// Track if user is logged in
const [loggedIn, setLoggedIn] = useState(false);
// check to see if there is any loading...
const [loading, setLoading] = useState(true);
//store user information in state
const [userInformation, setUserInformation] = useState({});
const [appInitialized, setAppInitialized] = useState(false);
// Error
const [errors, setErrors] = useState();
// Ensure app is initialized when it is ready to be
useEffect(() => {
// initialized firebase
initializeApp(FirebaseConfig);
setAppInitialized(true);
}, []);
// check to see if user is logged in
// user loads page, check their status
// set state accordingly
useEffect(() => {
if (appInitialized) {
const auth = getAuth();
onAuthStateChanged(auth, (user) => {
if (user) {
//user is signed in
setUserInformation(user);
setLoggedIn(true);
} else {
// user is signed out
setUserInformation({});
setLoggedIn(false);
}
// whenever state cxhanges setLoading to false
setLoading(false);
});
}
}, [appInitialized]);
function logout() {
const auth = getAuth();
signOut(auth)
.then(() => {
setUserInformation({});
setLoggedIn(false);
setErrors();
})
.catch((error) => {
console.warn(error);
setErrors(error);
});
}
if (loading || !appInitialized) return null;
return (
<div>
<Header
logout={logout}
loggedIn={loggedIn}
userInformation={userInformation}
/>
<Router>
<Routes>
<Route
path="/login"
element={
!loggedIn ? (
<Login
setErrors={setErrors}
setLoggedIn={setLoggedIn}
setUserInformation={setUserInformation}
/>
) : (
<Navigate to="/" />
)
}
/>
<Route
path="/create-user"
element={
!loggedIn ? (
<CreateUser
setLoggedIn={setLoggedIn}
setUserInformation={setUserInformation}
setErrors={setErrors}
/>
) : (
<Navigate to="/" />
)
}
/>
</Router>
Комментарии:
1. Можете ли вы поделиться кодом своей
setUserInformation()
функции? Я хотел бы подтвердить, используете ли выupdateProfile
что-либо в этом.2. @Dharmaraj Я обновил свой код, мой setUserInformation() находится в App.js и передан в функцию CreateUser на моем CreateUserPage.js
Ответ №1:
Когда регистрируется новый пользователь, вам нужно будет обновить его отображаемое имя, используя updateProfile()
метод, как показано ниже:
const displayName = e.currentTarget.displayName.value;
createUserWithEmailAndPassword(auth, email, password)
.then(async (userCredential) => {
// ^^^^^ async function
// Signed in
const user = userCredential.user;
setLoggedIn(true);
// Updating user name
await updateProfile(auth.currentUser, { displayName })
setUserInformation({
displayName,
email: user.email,
uid: user.uid,
accessToken: user.accessToken,
});
setErrors();
})
Теперь user.displayName
должно быть обновлено.
Проверьте документацию для получения дополнительной информации.
Комментарии:
1. боже, большое вам спасибо, это сработало!!