Firebase云功能-设置服务帐户

时间:2019-07-29 20:59:32

标签: node.js firebase google-cloud-firestore google-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文件中,基本上是从打字稿编译为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引用

1 个答案:

答案 0 :(得分:1)

您不能在部署到Cloud Functions的代码中引用本地计算机上的文件,

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

这根本行不通。您需要在功能文件夹中部署密钥以及代码,并要求它具有相对路径而不是绝对路径。

如果可能的话,您可以只使用默认服务帐户,并赋予它必要的权限,以执行必要的操作,那就更好了。