我注意到Cloud Function
通过 Pub/Sub 调用时出现错误。每次它都会抛出一个错误:
Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
at GoogleAuth.getApplicationDefaultAsync (/srv/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
at process._tickCallback (internal/process/next_tick.js:68:7)
我已经重新部署了它,并指定了使用凭证。并根据该建议重构了我的代码 https://stackoverflow.com/questions/58127896/error-could-not-load-the-default-credentials-firebase-function-to-firestore/58779000#58779000
但什么都没变。看起来谷歌发布了一些更新,导致它崩溃了。我想是因为我们的移动应用程序确实使用了 Firebase SDK 并直接调用了云函数。但它是用 Swift 编写的,而我的云函数是用 JS 编写的。所以这意味着我们正在使用不同的自由派,但有同样的问题有人知道这个问题吗?这对我的团队非常有帮助。提前谢谢。
答案1
出现此问题的原因有很多,解决方案也可能有所不同,
您可以尝试使用,gcloud auth application-default login
因为您可能没有登录,因此最终可能会收到此错误,您可以看到这个stackoverflow 线程了解更多信息。
您可以明确指定要使用哪个服务帐户来代替默认帐户,如下所述验证。
您还可以尝试将环境变量设置DETECT_GCP_RETRIES
为3
,看看它是否有效。这可以在部署函数时通过以下方式完成:在 gcloud 中设置或更新。
最后,正如你所说,这可能是因为你使用的版本。所以尝试将其更改为稳定版本。
答案2
正如在github 问题
在函数之外的全局范围内创建一个客户端将解决此问题参见:函数执行生命周期。
如果你的代码如下所示:
const {CloudTasksClient} = require('@google-cloud/task');
// CloudTasksClient, could be Storage, or Vision, or Speech.
const task = new CloudTasksClient();
export.helloWorld = (req, res) => {
res.send('hello world');
}
改为写:
const {CloudTasksClient} = require('@google-cloud/task');
// CloudTasksClient, could be Storage, or Vision, or Speech.
let task;
export.helloWorld = async (req, res) => {
if (!task) {
task = new CloudTasksClient();
}
await task.doSomething(); // or storage.doSomething(), etc.
res.send('hello world');
}
有采取行动保护人们免受这个问题的困扰。但是,正如执行时间线中所描述的,问题的核心是异步工作不能在你的函数的请求周期之外发生。
这也可能解决问题
使用 firebase-tools CL 部署时,您可以在云函数上设置环境变量
将环境变量 DEBUG_AUTH 设置为 true
跑步
npm install --save @google-cloud/firestore@latest gcp-metadata@latest
有两种方法可以做到这一点:
1.官方(旧)方法是使用 gcloud 或 pantheon 设置变量。CLI 将在未来的部署中尊重该变量。
2.您可以选择使用点 env 文件管理环境变量(目前尚未公开)。您可以通过调用以下命令完成此操作:
firebase --open-sesame dotenv
#From their functions directory
echo "DEBUG_AUTH=true" > .env
firebase deploy --only functions