当尝试使用服务帐户密钥部署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
文件中,基本上是从打字稿编译为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)
我需要此功能的用途是,每次将文档上传到Firebase存储时,基本上都创建一个带有downloadURL和几个其他键的Firestore引用
答案 0 :(得分:1)
您不能在部署到Cloud Functions的代码中引用本地计算机上的文件,
var serviceAccount = require("/Users/danielec/Desktop/storage_to_firestore/functions/key.json");
这根本行不通。您需要在功能文件夹中部署密钥以及代码,并要求它具有相对路径而不是绝对路径。
如果可能的话,您可以只使用默认服务帐户,并赋予它必要的权限,以执行必要的操作,那就更好了。