Firebase云功能管理员

Ste*_*ano 5 firebase firebase-authentication google-cloud-functions

我试图将我的所有功能拆分为多个文件,但是firebase-admin初始化存在问题。我的第一个文件是这样的:

const functions = require('firebase-functions');
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)
const userHandler = require('./user')
Run Code Online (Sandbox Code Playgroud)

第二个文件user.js

const functions = require('firebase-functions')
const admin = require('firebase-admin')
...
exports.update = (req, res) => {
   admin.auth().verifyIdToken(req.body).catch(error => {console.log(error)}
}
Run Code Online (Sandbox Code Playgroud)

全部在一个文件中运行完美,在2个单独的文件中给我这个错误:

ReferenceError: ISTANCE_NAME is not defined
Run Code Online (Sandbox Code Playgroud)

我无法在user.js中执行第二个initializeApp,因为firebase抛出错误:

错误:默认的Firebase应用程序已存在。这意味着您多次调用了initializeApp(),而没有提供应用名称作为第二个参数。在大多数情况下,您只需要调用一次initializeApp()。但是,如果您确实要初始化多个应用程序,则将第二个参数传递给initializeApp()以为每个应用程序指定唯一的名称。

如何在2个文件中共享相同的admin角色?我也尝试过将initializeApp函数放到另一个文件中,然后导入它,但不起作用,出现同样的错误(未定义ISTANCE_NAME)

小智 1

这是个好问题。

所以你说你只能打电话admin.initializeApp()一次是正确的。

索引.js

const functions = require('firebase-functions');
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)
const userHandler = require('./user')
Run Code Online (Sandbox Code Playgroud)

用户.js

const admin = require('firebase-admin')
Run Code Online (Sandbox Code Playgroud)

您不需要再次初始化它。配置在首次初始化后会正确存储。

或者,您可以做更混乱的事情,例如getAdmin()函数。

我过去的做法是定义函数并使用处理函数创建单独的文件,如下所示

updateHandler(req, res, admin); // or the other
updateHander(whateverParamsToOtherFile);
Run Code Online (Sandbox Code Playgroud)

笔记

您的所有函数都必须从文件中导出,index.js才能在 Firebase 上正确部署。我建议index.js存储所有函数,并从其他文件调用处理程序。

通过参数传递,就可以达到你想要的结果。但在 的特定情况下admin.initializeApp(),如果它在index.js.