Я пытаюсь выяснить, как настроить реагирующее веб-приложение firebase.
У меня есть файл конфигурации firebase. js всеми перечисленными ниже способами. Помощник, который запускает метод регистра, включен в этот файл как:
async register({email, password, name, beta, roleNominated}) {
await this.auth.createUserWithEmailAndPassword(email, password);
await this.auth.currentUser.updateProfile({
displayName: name,
})
const uid = this.auth.currentUser.uid;
await
this.firestore.collection("users").doc(uid).set({
role: 'PENDING',
createdAt: app.firestore.FieldValue.serverTimestamp(),
Весь файл:
import app from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
// import 'firebase/storage';
const devConfig = {
apiKey: process.env.REACT_APP_DEV_API_KEY,
authDomain: process.env.REACT_APP_DEV_AUTH_DOMAIN,
databaseURL: process.env.REACT_APP_DEV_DATABASE_URL,
projectId: process.env.REACT_APP_DEV_PROJECT_ID,
storageBucket: process.env.REACT_APP_DEV_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_DEV_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_DEV_APP_ID
};
const prodConfig = {
apiKey: process.env.REACT_APP_PROD_API_KEY,
authDomain: process.env.REACT_APP_PROD_AUTH_DOMAIN,
databaseURL: process.env.REACT_APP_PROD_DATABASE_URL,
projectId: process.env.REACT_APP_PROD_PROJECT_ID,
storageBucket: process.env.REACT_APP_PROD_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_PROD_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_PROD_APP_ID
};
const config =
process.env.NODE_ENV === 'production' ? prodConfig : devConfig;
class Firebase {
constructor() {
app.initializeApp(config)
this.firestore = app.firestore();
this.auth = app.auth();
}
// helper functions for authentication and user management
async register({email, password, name, beta, roleNominated}) {
await this.auth.createUserWithEmailAndPassword(email, password);
await this.auth.currentUser.updateProfile({
displayName: name,
})
const uid = this.auth.currentUser.uid;
await
this.firestore.collection("users").doc(uid).set({
role: 'PENDING',
createdAt: app.firestore.FieldValue.serverTimestamp(),
});
await this.auth.currentUser.sendEmailVerification();
}
login(email, password) {
return this.auth.signInWithEmailAndPassword(email, password)
};
logout() {
return this.auth.signOut();
}
getUser() {
return this.auth.currentUser();
}
authChange(user) {
return this.auth.onAuthStateChanged(user);
}
sendEmailVerification = () =>
this.getUser.sendEmailVerification({
// url: process.env.REACT_APP_CONFIRMATION_EMAIL_REDIRECT
url: process.env.NODE_ENV === 'production' ? process.env.REACT_APP_PROD_CONFIRMATION_EMAIL_REDIRECT : process.env.REACT_APP_DEV_CONFIRMATION_EMAIL_REDIRECT,
});
};
export default new Firebase();
У меня есть форма регистрации с:
import import Firebase from '../../../../firebase.js';
затем регистр вызывается в onCreate:
const onCreate = async values => {
try {
await Firebase.register(values)
} catch(err){
console.error(err);
}
setVisible(false);
};
регистр импортируется из файла firebase. js.
Когда я запускаю это в своей локальной среде - я успешно аутентифицируйте пользователя в модуле аутентификации firebase и создайте документ пользователя в коллекции пользователей со значениями, которые я запросил в методе register.
Когда я внедряю это в производственную среду, шаг аутентификации завершается успешно, но ошибки генерируются при попытке сделать документ в коллекции пользователей. Сообщение об ошибке гласит:
Ошибка типа: this.firestore.collection (...). Set не является функцией
Я видел этот пост , которая также имеет проблему с развертыванием кода, который работает в разработке, но не работает в Firebase. Эта конкретная проблема, похоже, связана с тем, как даты используются в ES6.
У меня одни и те же правила безопасности в проектах производства и разработки, и у обоих:
match /users/{userId} {
allow read;
allow write;
}
Есть ли какие-либо рекомендации? как выяснить, что мешает коллекции пользователей firestore создать документ в производственной среде?