node.js - 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 存储时
解决方案
您无法在部署到 Cloud Functions 的代码中引用本地计算机上的文件,如下所示:
var serviceAccount = require("/Users/danielec/Desktop/storage_to_firestore/functions/key.json");
这根本行不通。您需要将密钥与您的代码一起部署在函数文件夹中,并使用相对路径而不是绝对路径来要求它。
如果您能够在可能的情况下只使用默认服务帐户,并授予它必要的权限以在必要时执行它需要执行的操作,那就更好了。
推荐阅读
- php - ErrorException 未定义变量:帖子
- c# - 为什么 Visual Studio Code Debugger 无法使用 1.43.1 版(用户设置)?
- linux - Linux HPC 集群设置上的软件安装
- sql-server - SQL Server Management Studio - 将包含软件名称和版本的列添加到具有特定软件的系统的 SQL Query
- python - 在第一个循环中创建一个 key:value 对,并在后续循环中附加更多值
- mysql - 使节点mysql运行最快的最佳技术?
- django - Django 403 禁止 CSRF
- java - 在“try”块中抛出的 Java 异常不能在“try...catch”之外被捕获
- python - 如何按几何类型过滤地理数据框?
- javascript - 如果不直接传递给 requestAnimationFrame 函数体不会执行