默认 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。在 FirebaseAppError

Posted

技术标签:

【中文标题】默认 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。在 FirebaseAppError【英文标题】:The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services. at FirebaseAppError 【发布时间】:2019-12-15 06:43:29 【问题描述】:

我正在学习使用 Firebase Cloud Function,我正在关注 Firebase 的 Learn javascript Promises (Pt.1) 官方教程视频

当我运行本地服务器并转到 HTTP 链接时,我得到了

错误:默认 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。

我试图找到解决方案,但在任何地方都找不到。我有一些模糊相关的问题,但对于 javascript,我的代码在打字稿中。我确实在 .js 和 .ts 文件中添加了建议的语法

admin.initializeApp(functions.config().firebase);

但我还是遇到了同样的错误

这是我的 index.tcs。

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

// Start writing Firebase Functions
// https://firebase.google.com/docs/functions/typescript

export const getVoucher = functions.https.onRequest((request, response) => 
    const promise = admin.firestore().doc('/voucher/Eg2AtnGmKmX8Y0vBZiBG').get()
    const p2 = promise.then(snapshot=>
        const data = snapshot.data()
        response.send(data)
    )
    p2.catch(error => 
        //Handlle the error
        console.log('error: '+error)
        response.status(500).send(error)
    )
);

该功能在部署到 firebase 时按预期工作。

【问题讨论】:

【参考方案1】:

您应该只在代码的全局范围内调用admin.initializeApp()。请勿传递任何参数来接受默认服务帐号,该帐号应有权读取和写入您的 Cloud Firestore 数据库。

【讨论】:

全球范围会在导入后?抱歉,我对此很陌生 任何不在函数或其他带花括号的块内的地方,通常不会缩进。 您能否解释一下“不要传递任何参数以接受默认服务帐户,该帐户应有权读取和写入您的 Cloud Firestore 数据库。”方法?我现在收到此错误“错误:错误:无法加载默认凭据。浏览至cloud.google.com/docs/authentication/getting-started 以获取更多信息。”似乎与服务帐户相关问题有关。 另外,如果我将它部署到firebase,该功能可以正常工作,因此错误仅在本地服务器中。 确保您拥有最新版本的模拟器。这意味着更新全局 firebase-tools 模块。【参考方案2】:

忠告,有时即使您正确初始化应用程序也会出现这种情况,此时只需检查您的数据库实例是否放置在非全局函数内。

#nodejs

var db = admin.database();//inside function

【讨论】:

【参考方案3】:

这听起来可能很疯狂,但我遇到了同样的问题。然后我改变了我的“admin.initializeApp();”像下面这样的地方。然后就可以了。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const express = require('express');
const app = express();
//put here.
admin.initializeApp();

const db = admin.firestore();

const firebaseConfig = 
// config data
;

const firebase = require('firebase');

firebase.initializeApp(firebaseConfig);

【讨论】:

【参考方案4】:

您必须在使用 firestore 或任何其他功能之前初始化应用 admin.initializeApp()。

【讨论】:

【参考方案5】:

我使用打字稿,一个pattner单例,因为 admin.initializeApp();需要一个唯一的实例

import admin from 'firebase-admin';
export default class firebaseDAO 

    private static _intance: firebaseDAO;
    db: any;
    private constructor() 

        admin.initializeApp();
        this.db = admin.firestore();
    

    public static get instance() 
        return this._intance || (this._intance = new this());
    

    // iniciar un metodo
    start() 
    

创建一个 DAO

import firebaseDAO from '../database/firebase.dao';

constructor()
    this.db =  firebaseDAO.instance.db;


async getPacientes() 
    try 
        const userQuerySnapshot = await this.db.collection('pacientes').get();
        const users: any[] = [];
        userQuerySnapshot.forEach(
            (doc: any) => 
                users.push(
                    id: doc.id,
                    data: doc.data()
                );
            
        );
        this.response.resultado=users;
        return  this.response;
     catch (error) 
        this.response.resultado=null;
        return  this.response;
    

【讨论】:

【参考方案6】:

试试看:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const app = require('express')();
const firebase = require('firebase');    

// service account file custom for serve    
var serviceAccount = require("serviceAccount.json"); // for deploying you need to delete it

// admin credential for localhost or emulator
admin.initializeApp(
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "database_url"
);

// Firebase SDK configuration        
const config =
    //firebase config
;

firebase.initializeApp(config);
    
const db = admin.firestore();

【讨论】:

以上是关于默认 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。在 FirebaseAppError的主要内容,如果未能解决你的问题,请参考以下文章

未创建任何 firebase 应用程序“默认” - 调用 firebase.initializeapp()

错误:默认 Firebase 应用已存在。真的吗?

Swift:Firebase:如何确保除了我的应用程序之外没有人可以访问我的数据库

“initialize_app '默认的 Firebase 应用已经存在。”云函数 pub sub

“typeof firebase”类型不存在属性“default”。错误

错误:无法获取 Firebase 项目项目名称。请确保该项目存在并且您的帐户有权访问它