从另一个js文件导入Firebase模块的正确方法是什么?

时间:2019-03-26 12:53:12

标签: node.js firebase authentication module

我正在尝试使用auth方法开发一个Firebase Webapp。

在我的函数文件夹中,有文件index.jsauth.js,我已经用以下命令在index内导入了Firebase方法:

const functions = require('firebase-functions');
const firebase = require('firebase-admin');
const express = require('express');
const engines = require('consolidate');
const userService = require('./auth');

const firebaseApp = firebase.initializeApp(
    functions.config().firebase
);

并且索引文件可以正常工作,问题是在firebase文件中也需要auth,但是如果我在文件的顶部书写:

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

const firebaseApp = firebase.initializeApp(
    functions.config().firebase
);

通过我的错误提示: The default Firebase app already exists. This means you called initializeApp() more than once without providing an app name as the second argument. In most cases you only need to call initializeApp() once

因此,我尝试像这样从index获取firebase: const firebase = require('./index'); 但这向我显示了此错误:firebase.auth is not a function

(我在函数中调用firebase.auth().signInWithEmailAndPassword(email, password)以便登录)

使其生效的唯一方法是编写:

const firebase = require("firebase");
var config = {
    apiKey: "*****",
    authDomain: "***.com",
    databaseURL: "https://***.com",
    projectId: "****",
    storageBucket: "v***.com",
    messagingSenderId: "*****"
  };
    firebase.initializeApp(config);

const db = firebase.firestore();

但是当我尝试部署到Firebase时出现错误,因此我很确定这不是正确的方法。

我想我搞砸了进口货,我该怎么办?

1 个答案:

答案 0 :(得分:0)

这两个JavaScript文件似乎已捆绑到一个应用程序中。这意味着您需要在两个文件中同时导入,但仅应在首先加载到分发包(可能为index.js)中的文件中初始化Firebase应用程序。需要Firebase的辅助文件应仅包含导入文件,而不包含 initializeApp


作为一种解决方法,您可以通过将应用程序包装在if中来确保仅将其初始化一次:

if (firebase.apps.length === 0) {
  var config = {
    ...
  };
  firebase.initializeApp(config);
}

最后:您共享的代码是客户端和服务器端(云功能)JavaScript代码的混合,这使得很难确定正在发生什么。

请记住,此导入仅应存在于Cloud Functions服务器上运行的JavaScript代码中:

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

并且只有在客户端上运行的JavaScript代码中才能使用此代码:

firebase.auth().signInWithEmailAndPassword(email, password)