【问题标题】:Authentication with Firebase and Cloud Firestore使用 Firebase 和 Cloud Firestore 进行身份验证
【发布时间】:2019-12-04 18:48:54
【问题描述】:

我正在尝试弄清楚如何向使用 Cloud Firestore 而不是实时数据库的 React 应用程序添加身份验证。

我关注了this tutorial 并让整个工作正常进行。然后 - 我试图添加的更改是从实时数据库迁移到 Cloud Firestore - 这对身份验证是否有效产生了影响。我已经创建了 20 个新项目来尝试完成这项工作 - 完全没有教程中的过程,只依赖 firebase documentation。它们都不起作用。

目前,我有一个配置文件:

import app from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import firestore from "firebase/firestore";

class Firebase {
  constructor() {
    app.initializeApp(config).firestore();
    this.auth = app.default.auth();
    // this.db = app.firebase.database()
    this.db = app.firestore();

  }  

然后,我有一个带有这个提交处理程序的表单:

  import Firebase from '../../../firebase.1';

handleCreate = () => {
    const { form } = this.formRef.props;
    form.validateFields((err, values) => {
      if (err) {
        return;
      };
    const payload = {
    // ...values,
    name: values.name,
    email: values.email,
    organisation: values.organisation,
    beta: values.beta,
    role: values.role,
    // createdAt: Firebase.FieldValue.serverTimestamp()
    }
    console.log("formvalues", payload);

    Firebase
    .auth()
    .createUserWithEmailAndPassword(values.email, values.password)
    console.log('Received values of form: ', values);
    Firebase
    .collection("users")
    .add(payload)
    // .then(docRef => {
    //     resetForm(initialValues);
    // })
    .then(e => this.setState({ modalShow: true }))


    form.resetFields();
    this.setState({ visible: false });
    this.props.history.push(DASHBOARD);

  });

    };

目前,当我 console.log(Firebase) 我得到:

Uncaught ReferenceError: Firebase 未定义

我看过this post 并遵循了所有答案中的每一项建议。

我已尝试更改配置文件用途:

this.auth = app.default.auth();

没什么区别。

当我尝试使用它时,我收到一条错误消息:

TypeError: _firebase_1__WEBPACK_IMPORTED_MODULE_14__.default.auth is not a function

有谁知道如何在 firebase 中使用身份验证 - 那里有一个 Cloud Firestore 而不是实时数据库 - 这太奇怪了,这对身份验证工具是否有效产生了影响。

我已经关闭了时间戳条目,因为我也无法让 firestore 记录它 - 但这是另一天的问题。我现在真的很想弄清楚如何使用身份验证工具。

下一次尝试

我尝试更改 firebase.js 文件,使配置现在看起来像这样:

import app from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';


const devConfig = {

};

const prodConfig = {
};

const config =
  process.env.NODE_ENV === 'production' ? prodConfig : devConfig;


const Firebase = app.initializeApp(config);
const database = app.firestore();
const auth = app.auth();
const settings = { timestampsInSnapshots: true };


export { Firebase, database as default, settings, auth };

现在,我收到一条错误消息:

类型错误:_components_firebase__WEBPACK_IMPORTED_MODULE_2__.default 不是构造函数

我一直在谷歌搜索 - 什么是构造函数。什么是过去几个小时的 webpack 导入的模块编号参考等。我很想知道如何将这些错误信息翻译成可以理解的东西。

谷歌搜索这个确切的错误消息表明导入和导出语句的方式有问题。 firebase.js 中的新导出是不寻常的(但 Stack Overflow 上的其他人在使用 Firebase 时遇到了问题)。这对我来说仍然是一个问号,因为我不明白错误消息的含义。

错误信息指向我的 src/index.js 这一行

ReactDOM.render(

  <FirebaseContext.Provider value={new Firebase()}>

该行来自:

import FirebaseContext, { withFirebase } from './Context';
import Firebase from '../../firebase.1';
export default Firebase;
export { FirebaseContext, withFirebase };

该文件从以下位置导入:

import React from 'react';
const FirebaseContext = React.createContext(null);

export const withFirebase = Component => props => (
  <FirebaseContext.Consumer>
    {firebase => <Component {...props} firebase={firebase} />}
  </FirebaseContext.Consumer>
);
export default FirebaseContext;

如果有人对学习如何了解错误消息的含义有任何建议,那将是一个巨大的启示。暂时我猜。

【问题讨论】:

  • 我认为错误是因为您正在调用new Firebase(),您只需要调用Firebase,这是对firebase初始化对象的引用。也可能更好地将其设为小写,如firebase
  • 感谢 Hristo - 接下来我会尝试。本教程和我一样 - 奇怪的是它会给出详细但不正确的说明。我会试一试,然后告诉你。
  • 大写的 Firebase 是因为配置以这种大小写样式导出它。当我删除新的并且只有 Firebase 时,生成的错误是:TypeError: Object(...) is not a function
  • 我说的是你的 NEXT ATTEMPT 部分,这并不完全符合教程。您没有在那里导出课程。您只是在导出const Firebase = app.initializeApp(config);。如果您提供完整的项目,将会容易得多。这将是帮助您的最简单方法。

标签: reactjs firebase google-cloud-firestore firebase-authentication


【解决方案1】:

我最近也刚刚完成了教程,但我简化了我的 firebase 文件。我只导出对初始化的firebase的引用

import app from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';

const config = {
  //...
};

const firebase = app.initializeApp(config);

export default firebase;

在我的项目中,我有:

//...
import firebase from '../../firebase';
//...

useEffect(() => {
  const listener = firebase
    .firestore()
    .collection(COLLECTIONS.USERS)
    .onSnapshot(querySnapshot => {
      setUsers(querySnapshot);
      querySnapshot.forEach(doc => console.log(doc.id, doc.data()));
    });

  return listener;
}, []);
//...

在这里查看我的 Github 项目 -> https://github.com/henev/react-auth-with-firebase

【讨论】:

  • 谢谢@Hristo - 我唯一的导出是 Firebase,我一直在尝试返回导出在单独的 const 中定义的每个不同模块。接下来我会尝试你的方法。
  • 我用我的 Github 项目进行了编辑。看看吧:)我可能很快就会添加一个实时版本。
  • 非常感谢!我今天去看看!
  • 您是否按照教程重新设计了所有组件?我无法将这两个步骤与基础一起使用 - 它会引发指向 index.js 中的上下文提供程序的错误(TypeError: components_firebase__WEBPACK_IMPORTED_MODULE_2_.default 不是构造函数),但我可以看到你已将您的移至 App.js。我现在正在处理您的代码,但如果您在开始使用您的方法之前了解了教程方法是否可以使用,我会很高兴。再次感谢分享。我正在努力追随你的所作所为。
  • 是的,我一直在按照教程进行操作,但在某些时候我开始重新设计它。如您所见,我删除了 Firebase 类以及随之而来的 HOC 和上下文。基本上,我获得 firebase 的唯一地方是 firebase.js,我只有我的 firebase 实例。
猜你喜欢
  • 2017-08-30
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2018-12-06
  • 2020-10-21
  • 2021-05-27
相关资源
最近更新 更多