尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

IT技术 javascript firebase google-cloud-firestore
2021-01-24 15:10:52

当我尝试初始化 Firebase Cloud Firestore 时,遇到以下错误:

未捕获的类型错误WEBPACK_IMPORTED_MODULE_0_firebase .firestore 不是函数

npm install firebase --save以前安装了firebase

import * as firebase from 'firebase';
import router from '../router';

const config = {
        apiKey: "a",
        authDomain: "a",
        databaseURL: "a",
        projectId: "a",
        storageBucket: "a",
        messagingSenderId: "a"
};
if(!firebase.apps.length){
  firebase.initializeApp(config);
  let firestore = firebase.firestore();
}
6个回答

我通过导入多个库来修复它:firebasefirebase/firestore. 那是因为firebase核心库不包括 firestore 库。

import firebase from 'firebase/app';
import 'firebase/firestore';
谢谢!第二个导入语句是我所缺少的。
2021-03-15 15:10:52
如果您使用 React Native,则会在 Android 上中断。在 iOS 上似乎没问题:-/
2021-03-22 15:10:52
我正在使用 vanilla js 来构建一个简单的聊天应用程序,我在 HTML 文件的 head 标签中包含了静态 URL,但仍然出现此错误,请帮忙,在此先感谢
2021-03-31 15:10:52
截至 2019 年 2 月,此功能完美运行。谢谢!!:)
2021-04-08 15:10:52

首先,确保您拥有最新版本的 firebase:

npm install firebase@4.12.0 --save

接下来,添加 firebase 和 firestore:

const firebase = require("firebase");
// Required for side-effects
require("firebase/firestore");

初始化 Firebase 应用程序:

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

// Initialize Cloud Firestore through Firebase
var db = firebase.firestore();

来源:https : //firebase.google.com/docs/firestore/quickstart?authuser=0

import { firebase } from '@firebase/app';
import '@firebase/firestore'

如果您也使用身份验证

import '@firebase/auth';
对我来说,我不需要添加该导入行,但 auth 工作正常。为什么它只用于firestore?
2021-04-11 15:10:52

希望这对在将 Angular 应用程序部署到 Firestore 时遇到同样问题的人有所帮助。

在 Angular 8 项目中,我在部署到 Firestore 时遇到了同样的错误。我通过添加另一个moduleAngularFirestoreModule 来修复它

App.module.ts 是这样的:

...
import { AngularFireModule } from '@angular/fire';
import { AngularFirestore, AngularFirestoreModule } from '@angular/fire/firestore'; // << Note AngularFirestoreModule !!!
import { AngularFireDatabaseModule } from '@angular/fire/database';
...

imports: [
    BrowserModule,
    FormsModule,
    AngularFireModule.initializeApp(environment.firebaseConfig),
    AngularFirestoreModule,
    AngularFireDatabaseModule,
...

包.json:

...
"dependencies": {
    "@angular/animations": "~8.2.2",
    "@angular/common": "~8.2.2",
    "@angular/compiler": "~8.2.2",
    "@angular/core": "~8.2.2",
    "@angular/fire": "^5.2.1",
    "@angular/forms": "~8.2.2",
    "@angular/platform-browser": "~8.2.2",
    "@angular/platform-browser-dynamic": "~8.2.2",
    "@angular/router": "~8.2.2",
    "ajv": "^6.10.2",
    "bootstrap-scss": "^4.3.1",
    "core-js": "^2.5.4",
    "firebase": "^6.4.0",
...

更新:当我部署到其他托管服务提供商时,这没有帮助。对于这种情况,我添加了原始的 firebase 库并且它起作用了。

import { firestore } from 'firebase'; 
谢谢。就我而言,不需要更新(从 'firebase' 导入 { firestore }; )。
2021-03-21 15:10:52
非常感谢!将 AngularFirestoreModule 添加到导入节省了一天!
2021-03-26 15:10:52
男子。我很生气,添加 AngularFirestoreModule 解决了我的问题,哈哈。应用程序在没有它的情况下在本地运行,但在 Heroku 上失败了。添加这个是修复......奇怪的是,几个月前该应用程序在没有它的情况下工作。猜猜我确实需要这个更新。
2021-04-03 15:10:52

您可以使用凭据创建一个单独的组件,用于在您的应用程序上初始化 Firebase。

firebase-context.js

import * as firebase from 'firebase'
import 'firebase/firestore';

const firebaseConfig = {
            apiKey: "XXXX",
            authDomain: "XXXXX.firebaseapp.com",
            databaseURL: "https://XXXX-app-web.firebaseio.com",
            projectId: "XXXX",
            storageBucket: "XXXX-app-web.appspot.com",
            messagingSenderId: "XXXXXX",
            appId: "1:XXX:web:XXXX",
            measurementId: "G-XXXX"
        };

export default !firebase.apps.length 
  ? firebase.initializeApp(firebaseConfig).firestore()
  : firebase.app().firestore();

如果需要处理数据库操作,不需要每次都调用初始化方法,可以使用之前创建的通用组件方法。

import FirebaseContext from "./firebase-context";

export const getList = () => dispatch => {
    FirebaseContext.collection("Account")
        .get()
        .then(querySnapshot => {
            // success code
        }).catch(err => {
            // error code
        });
}