В 7.15.5 Firebase и 16.13.1 React кажется, что любой вызов API Firebase в предложении «then» createUserWithEmailAndPassword полностью игнорируется. Код является примером моего отредактированного файла App. js после запуска приложения create-response-app (другие файлы не были изменены). Печатаются «здесь1» и «здесь2», но нет других сообщений. Если я вернусь к Firebase 7.9.0, он будет работать правильно.
В примечаниях к выпуску Firebase, 7.15.5 говорит: «Исправлена ошибка, которая иногда приводила к сбою операций Cloud Firestore во время смены токена аутентификации» и 7.15. 1 говорит: «Исправлена проблема, из-за которой клиент не мог подключиться к бэкэнду сразу после того, как пользователь вошел в систему» Так что, похоже, это было проблемой раньше.
Я связался с командой поддержки Firebase, и они не смогли воспроизвести проблему (в той среде, которую они использовали, а не в React), и они сказали мне спросить здесь. Этот код не работает в 7.15.5, но тот же код работает в 7.9.0.
import React, { useState } from 'react';
import './App.css';
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import 'firebase/storage';
firebase.initializeApp({
//REDACTED
});
const fireAuth = firebase.auth();
const fireData = firebase.firestore();
function App() {
const [email, setEmail] = useState('');
const [pass, setPass] = useState('');
const registerUser = () => {
//see if the email is allowed to register
fireData.collection('future_users').doc(email).get().then(documentSnapshot => {
const futureUserData = documentSnapshot.data();
//if allowed then create user
if (documentSnapshot.exists && futureUserData) {
fireAuth.createUserWithEmailAndPassword(email, pass).then(userCredential => {
//if user object is not null (dont know why it would be) then create user document
if (userCredential.user) {
const newUser = {
id: userCredential.user.uid,
email: email,
firstName: futureUserData.firstName,
lastName: futureUserData.lastName,
admin: futureUserData.admin
}
console.log('here1');
fireData.collection('users').doc(newUser.id).set({
email: newUser.email,
firstName: newUser.firstName,
lastName: newUser.lastName,
admin: newUser.admin
}).then(() => {
console.log('added user doc');
}).catch(() => {
console.log('failed to add user doc');
})
console.log('here2');
}
}).catch(error => {
console.log('failed to create user');
})
} else {
console.log('email not allowed to register');
}
}).catch(error => {
console.log('failed to get future user doc');
})
}
return (
<div>
<input onChange={event => setEmail(event.target.value)} />
<input onChange={event => setPass(event.target.value)} />
<button onClick={registerUser}>SUBMIT</button>
</div>
);
}
export default App;