Firestore - функция работает в режиме разработки, но не работает в производстве - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь выяснить, как настроить реагирующее веб-приложение 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 создать документ в производственной среде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...