首页 > 解决方案 > Firebase Cloud Functions - 设置服务帐户

问题描述

尝试使用服务帐户密钥部署 firebase 功能时遇到以下问题。

部署错误。加载用户代码时函数失败。错误消息:文件 lib/index.js 中的代码无法加载。您是否在 package.json 依赖项中列出了所有必需的模块?详细的堆栈跟踪:错误:找不到模块'/Users/danielec/Desktop/storage_to_firestore/functions/key.json'

这是我的代码。

// setup firestore
import admin = require('firebase-admin');
var serviceAccount = require("/Users/danielec/Desktop/storage_to_firestore/functions/key.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://testapp.firebaseio.com"
});

我确定服务密钥的路径是正确的,实际上问题似乎出现在index.js文件中,基本上是当它从 typescript 编译为 javascript 时。

关于如何解决这个问题的任何想法?

最后,我将完整的日志记录在这里:

✔  functions: Finished running predeploy script.
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (37.3 KB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: updating Node.js 8 function image_from_storage_to_firestore(us-central1)...
⚠  functions[image_from_storage_to_firestore(us-central1)]: Deployment error.
Function failed on loading user code. Error message: Code in file lib/index.js can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module '/Users/danielec/Desktop/storage_to_firestore/functions/key.json'
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/srv/lib/index.js:9:22)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)

更新:

如果我将上述代码更改如下,我就能够正确部署这些功能:

// setup firestore
import admin = require('firebase-admin');
admin.initializeApp({});

当我运行它时,在 firebase 控制台的日志中出现以下错误:

错误:身份和访问管理 (IAM) API 之前未在项目 291486585482 中使用或已禁用。通过访问 https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=291486585482启用它, 然后重试。如果您最近启用了此 API,请等待几分钟让该操作传播到我们的系统并重试。在 Gaxios.request (/srv/node_modules/gaxios/build/src/gaxios.js:70:23) 在 process._tickDomainCallback (internal/process/next_tick.js:229:7)

如果我使用错误消息中指定的链接启用,IAM API 我仍然会收到以下我无法解决的错误。

错误:需要权限 iam.serviceAccounts.signBlob 才能对服务帐户 testestest@appspot.gserviceaccount.com 执行此操作。在 Gaxios.request (/srv/node_modules/gaxios/build/src/gaxios.js:70:23) 在 process._tickDomainCallback (internal/process/next_tick.js:229:7)

我所需要的只是创建一个带有 downloadURL 和更多键的 firestore 引用,每次将文档上传到 firebase 存储时

标签: node.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


您无法在部署到 Cloud Functions 的代码中引用本地计算机上的文件,如下所示:

var serviceAccount = require("/Users/danielec/Desktop/storage_to_firestore/functions/key.json");

这根本行不通。您需要将密钥与您的代码一起部署在函数文件夹中,并使用相对路径而不是绝对路径来要求它。

如果您能够在可能的情况下只使用默认服务帐户,并授予它必要的权限以在必要时执行它需要执行的操作,那就更好了。


推荐阅读