Firebase:.default 不是构造函数

Posted

技术标签:

【中文标题】Firebase:.default 不是构造函数【英文标题】:Firebase: .default is not a constructor 【发布时间】:2020-03-30 21:10:00 【问题描述】:

我正在尝试关注this tutorial。

我目前停留在将反应上下文引入 firebase 的步骤中。

这个代码块是当前问题的根源:

import Firebase,  FirebaseContext  from './components/firebase';

ReactDOM.render(
  <FirebaseContext.Provider value=new Firebase()>
    <App />
  </FirebaseContext.Provider>,
  document.getElementById('root'),
);
serviceWorker.unregister();

当我尝试这个时,我收到一条错误消息:

TypeError:_components_firebase__WEBPACK_IMPORTED_MODULE_5__.default 不是构造函数

我见过this post,它与 Vue 相关,但表示 .default 错误的原因不是构造函数(而不是其余部分),因为不应使用 new 关键字调用 Firebase 对象。

我尝试删除新的,但会生成一条错误消息:

TypeError: Object(...) 不是函数

我想知道这是否与本教程为 firebase 配置应用程序的不寻常方式有关 - 这是一个使用构造函数的类(仍然不明白为什么要这样做):

class Firebase 
  constructor() 
    app.initializeApp(config);
    this.auth = app.auth();
    this.db = app.database();
  
export default Firebase;

是否有人将 Firebase 与 React 结合使用,知道如何使用上下文 API,如果知道,您是否找到解决此问题的方法?

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;

下一次尝试

我找到了this post,看起来它可能一直在尝试遵循相同的教程。

这种方法要求我在 firebase.1.js 配置文件中添加回 auth 方法,使其现在看起来像这样:

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

    // this.db = app.firebase.database()
    this.db = app.firestore();

    

  doCreateUserWithEmailAndPassword = (email, password) =>
    this.auth.createUserWithEmailAndPassword(email, password);  

那么,表单中的提交处理程序是这样的:

handleCreate = values => 
    values.preventDefault();

    const  name, email, password  = this.state;

    Firebase
    .doCreateUserWithEmailAndPassword = (email, password) => 
      return this.auth
        .createUserWithEmailAndPassword(email, password)
        .then((res) => 
        Firebase.firestore().collection("users").doc(res.user.uid).set(
          email: values.email,
          name: values.name,
          role: values.role,
          createdAt: Firebase.FieldValue.serverTimestamp()
        ).then(() => this.history.push(ROUTES.DASHBOARD));
      )
      .catch(err => 
        console.log(err.message);
      );
  ;
;

当我尝试这个时,我没有收到任何错误,但表单没有提交 - 它只是挂起。

下一次尝试

由于 FirebaseContext.Consumer 包含一行小写 firebase,因此我尝试了上述所有相同步骤,但将标题大小写 Firebase 替换为小写 firebase。我也试过this.firebase(我不知道为什么)和this.props.firebase(我看过其他帖子尝试过,但仍然不知道为什么)。

这些方法都不起作用。

当我尝试在 FirebaseContext.Provider 上方运行 console.log(Firebase) 时,我得到了一个很大的日志,其中包含许多以以下开头的下拉菜单:

FirebaseAppImpl firebase_: …, isDeleted_: false, services_: …, tokenListeners_:数组(0),analyticsEventRequests_:数组(0),... 内部:分析:…,getUid:ƒ,getToken:ƒ, addAuthTokenListener: ƒ, removeAuthTokenListener: ƒ

此日志中的一个下拉菜单标记为“options_”,其中包含我的 Firebase 应用凭据。

【问题讨论】:

如何在主代码中导出 Firebase 类/导入? 我更新了帖子以添加这些详细信息。 '../../firebase.1' 包含上面的 Firebase 类代码对吗? Firebase 似乎是未定义的。至少从错误中。您可以在导入它并引发错误的主代码中控制台记录Firebase 的值吗? (例如上面ReactDOM.render)是否按预期显示类? 是 - firebase.1 包含该类的 firebase 配置设置。 【参考方案1】:

我认为这可能与问题in my recent other answer有关。

我设法通过简化导入/导出设置让new Firebase 工作。

在 react 应用中,导入现在是:

import  FirebaseContext  from './components/context';
import Firebase from './components/firebase';

在我将 components/firebase.js 中复杂的“导入和重新导出”代码替换为教程中的 class Firebase 的定义之后,这些导入和 new 起作用。

在此之后弹出另一个错误Firebase: Firebase App named '[DEFAULT]' already exists (app/duplicate-app).,但这可能是因为我没有遵循整个教程并且缺少一些配置。

如果没有项目的完整源代码,复制您正在处理的所有内容是相当困难的。

这是我在npx create-react-app react-firebase-authentication 和安装firebase 之后使用的测试App.js

import React from 'react';
import logo from './logo.svg';
import './App.css';

import  FirebaseContext  from './components/context';
import Firebase from './components/firebase';

function App() 
    const foo = new Firebase()
    return (
    <div className="App">
      ... omitted ...
    </div>
  );


export default App;

【讨论】:

非常感谢。我明天有时间看看你做了什么。 * import 带有一个firebase警告,除了在开发中之外不要使用它,所以我正在尝试导入特定的包。我明天看看,然后回来找你。 我找到了删除 firebase 消费者属性的解决方案。我没有使用您的解决方案,但为了感谢您尝试提供帮助,请给予积分 @Mel 谢谢! (不确定这是多么合法。)你能用细节编辑我的帖子吗?或者更好的是做出自己的答案来描述与教程相关的变化。 (回答你自己的问题是完全可以的。我一直这样做,在 SO FAQ 中没问题)

以上是关于Firebase:.default 不是构造函数的主要内容,如果未能解决你的问题,请参考以下文章

构造函数与拷贝控制

获取未捕获的 TypeError: ...default 不是构造函数 - 来自 Vue 组件

构造析构赋值运算:条款5-条款12

vector 3 构造 析构

default & delete

firebase2.default.firestore 不是一个函数 - React Firebase