Firebase应用程序名为' [DEFAULT]'已经存在(app / duplicate-app)

时间:2017-04-10 19:01:14

标签: angularjs unit-testing firebase karma-runner karma-jasmine

您好我正在尝试使用AngularJS + Firebase开发一个简单的网站进行单元测试,但我在定义规范和尝试测试运行器时遇到问题

myProject / test / spec / main.js:

describe('Controller: MainCtrl', function() {

var MainCtrl, scope

beforeEach(module('MainApp'));

beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl', {
        $scope: scope
    })
}));

it('should....',function(){
    expect(true).toBe(true)
})
it('should2....',function(){
    expect(false).toBe(false)
})
});

结果:

PhantomJS 2.1.1 (Mac OS X 0.0.0) Controller: MainCtrl should.... FAILED
Error: [$injector:modulerr] Failed to instantiate module MainApp due 
to: Firebase: Firebase App named '[DEFAULT]' already exists 
(app/duplicateapp).

但是,定义规范一次不是问题。例如:

it('should....',function(){
   expect(true).toBe(true)
})

我不知道为什么这就是我给你提示的原因

这是我正在开发的项目。

https://github.com/parkwookyun/firebase-angular-board

9 个答案:

答案 0 :(得分:25)

if (!firebase.apps.length) {
   firebase.initializeApp({});
}

Similar answer here

答案 1 :(得分:4)

我使用firebase时遇到了同样的问题,我发现我正在两次初始化firebase,例如:

function initializeFirebase(){    
 var config = {
    apiKey: "myApiKey",
    authDomain: "myAuthDomain",
    databaseURL: "myDatabaseUrl",
    storageBucket: "myStorageBocket",
    messagingSenderId: "idhere"   
   };   
   //initialize firebase  
   firebase.initializeApp(config);  
}

在我的情况下,我使用的是react,而我是从两个不同的组件调用initializeFirebase(),但我决定从父组件调用它。现在我可以查询我的数据库,插入记录,删除等等。

希望这有助于某人

答案 2 :(得分:2)

我只看了一下你的github回购,看看你的问题中建议的文件比你提出的更多.js。 我有2个单独的.js文件。两者都包含在同一个html页面上,当我只相信该页面需要完成一次时,它们都配置和初始化默认应用程序。对我有用的是评论第二个" initializeApp()"我不再有那个错误。尝试在.js中查找以下内容并注释掉或删除其中一个初始化。

var config = { apiKey: "my api key", authDomain: "something.firebaseapp.com", databaseURL: "https://somesite.firebaseio.com", projectId: "myProjectId", storageBucket: "somesite.appspot.com", messagingSenderId: "someIntegers" }; //firebase.initializeApp(config);

答案 3 :(得分:1)

就我而言,我没有多次明确地致电initializeApp(),因此在阅读主要答案后仍然感到困惑。事实证明,如果您使用Firebase托管,则会通过SDK auto-configuration自动调用初始化,即,当index.html:<script src="/__/firebase/init.js"></script>中包含此行时,您无需调用initializeApp(config)

“当您部署到Firebase或在本地测试您的应用程序时,此脚本会自动为活动的Firebase项目配置Firebase JavaScript SDK并初始化SDK。” SDK auto-configuration

答案 4 :(得分:0)

我最近在自己的代码中解决了这个问题。我的问题是由于在我的html文件的头部和正文中意外链接我的javascript文件(调用initializeApp())引起的。我的修复是删除我的html文件头部中的重复javascript标记,因此只有一个存在于正文中。

扫描您的代码,确保只调用一次initializeApp()。这包括可能正在调用方法或复制html文件中的js文件的任何js文件。

答案 5 :(得分:0)

我遇到了同样的问题

如果您使用的是ES6模块,并且在npm之前安装了Firebase,则无法将初始化脚本添加到index.html

它是firebase相关性的重复

答案 6 :(得分:0)

发生此错误的原因仅仅是因为您尝试将Firebase多次初始化到项目中。

答案 7 :(得分:0)

检查项目是否在admin.apps中。如果是,请使用(如果未初始化)。这样可以防止错误发生。

const projectFbData = admin.apps.find((item) => item.name_ === projectId) || admin.initializeApp(config, projectId)

答案 8 :(得分:-1)

// config.js

let config = {
     apiKey: "***********",
    authDomain: "***********",
    databaseURL: "***********",
    projectId: "***********",
    storageBucket: "***********",
    messagingSenderId: "***********",
    appId: "",
    measurementId: "***********"
}

export default config;


// home.js 
import config from '../utils/config'; // import my config file
let db;
setTimeout(() => {
    if (!firebase.apps.length) {
        try {
            firebase.initializeApp(config)
        } catch (err) {
            console.log(err)
        }
    }
    db = firebase.firestore();
}, 1000)