为啥最新的 Firebase 服务不能再加载默认凭据
Posted
技术标签:
【中文标题】为啥最新的 Firebase 服务不能再加载默认凭据【英文标题】:Why can't latest firebase serve load the default credentials anymore为什么最新的 Firebase 服务不能再加载默认凭据 【发布时间】:2019-12-22 20:19:07 【问题描述】:我目前在 youtube 上关注 this tutorial,在大约 26 分钟时,作者正在使用 firebase serve
命令在本地运行他的函数。
这对他来说很好,但是一旦我尝试这样做,我就会收到下一个错误:
Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information. at GoogleAuth.getApplicationDefaultAsync (D:\\...\functions\node_modules\google-auth-library\build\src\auth\googleauth.js:161:19) at process._tickCallback (internal/process/next_tick.js:68:7)
现在,错误给了我一个链接,通过在我的窗口中设置一个环境变量来帮助我解决这个错误(我不喜欢,因为当我在不同的环境中开发时,这将如何工作以及如何工作?链接到不同 gmail 帐户的项目?)
我发现但尚未测试的另一个解决方案是使用 gcloud 命令gcloud auth application-default login
在本地进行身份验证。
这些步骤都不是作者在教程中完成的。
我在视频的 cmets 中进行了搜索,有人提到它与 firebase-tools 版本有关。他的解决方案是回到 firebase-tools 版本 6.8.0,而当前最新的是 7.2.2。
所以我想知道,当云功能尝试在远程 Firestore 数据库中存储某些内容时,使用 firebase-tools 7.2.2 的 firebase 服务无法再运行云功能的改变是什么,而这正在使用 firebase-工具 6.8.0?
它是否会像在 6.8.0 版本中那样在 7.2.2 或更高版本上工作?
【问题讨论】:
似乎this 是一个一致的案例。请问你解决了吗? @Philipp 看到我的回答,希望对你有所帮助! 【参考方案1】:对于遇到此问题的任何人,you can see my answer here
问题在于未处理的承诺。函数在完成后终止并且不等待回调,并且 Firebase Cloud Functions 不允许在处理器终止后访问处理器。
【讨论】:
【参考方案2】:我遇到了同样的问题。如果你想发布数据,教程的代码可以工作。 但是,如果您想从数据库中检索数据,则必须更改几行代码。
教程作者代码:
const functions = require('firebase-functions');
const express = require('express');
const app = express();
const admin = require('firebase-admin');
admin.initializeApp();
app.get('/screams', (req, res) =>
admin
.firestore()
.collection('screams')
.get()
.then(data =>
const screams = [];
data.map(doc =>
screams.push(
screamdId : doc.id,
content : doc.data().content,
createdAt : doc.data().createdAt,
username : doc.data().username,
likeCount : doc.data().likeCount,
commentCount : doc.data().commentCount
);
);
res.json(message : "Screams displayed successfully", data : screams);
)
.catch(err => );
);
exports.api = functions.https.onRequest(app);
改动后:
const functions = require('firebase-functions');
const express = require('express');
const app = express();
const admin = require('firebase-admin');
const serviceAccount = require('../path/to/privKey.js');
admin.initializeApp(
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://project-name.firebaseio.com'
);
app.get('/screams', (req, res) =>
console.log("I am here");
admin.firestore()
.collection('screams')
.get()
.then(data =>
const screams = [];
data.docs.map(doc =>
screams.push(
screamdId : doc.id,
content : doc.data().content,
createdAt : doc.data().createdAt,
username : doc.data().username,
likeCount : doc.data().likeCount,
commentCount : doc.data().commentCount
);
);
res.json(message : "Screams displayed successfully", data : screams);
)
.catch(err =>
res.status(500).json(message : "Some Error occured");
);
);
exports.api = functions.https.onRequest(app);
请注意:get().then(data => )
"data" 不会返回一个集合文档数组。你必须打电话给data.docs.map(doc => )
。否则它会说“data.map() 不是函数”。
【讨论】:
【参考方案3】:请改用firebase login
...参见CLI reference
(可以使用firebase
和gcloud
部署它们)。
【讨论】:
在创建新项目(firebase init)时,还需要在 init 步骤之前进行登录,以便选择项目。所以我已经登录了。但可以肯定的是,我将 firebase 工具更新到 7.2.2(还没有新版本,所以这个已经 18 天了),我按照你的建议进行了 firebase 登录。我收到一条消息说我已经登录了。所以我做了一个 firebase 服务,令人惊讶的是它现在正在工作,这是我没想到的。我也不明白,因为登录只向我显示了消息,没有启动登录程序。到目前为止,它现在对我来说就像魔术一样。【参考方案4】:考虑设置环境变量以提供所需的凭据。
设置环境变量可让您在应用程序之外单独提供凭据,而无需在部署时更改应用程序代码。
并不是说环境变量是永久的,因此您可以在此之后覆盖或更改它们。
【讨论】:
没错,但是如果您同时使用 2 个不同的 gmail 帐户处理 2 个或更多不同的项目怎么办?您是否需要一直更改环境变量值,或者是否有其他方便的技巧可以避免这种情况。 环境变量路径仅用于您当前的终端会话。如果您需要访问不同的项目,您可以设置服务帐户来访问您的项目。您可以为两个项目使用一个服务帐号,也可以为每个项目使用一个服务帐号。以上是关于为啥最新的 Firebase 服务不能再加载默认凭据的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Firebase 'child_added' 事件出现乱序?
为啥注册用户未在 Firebase 中进行身份验证?为啥用户不能将产品添加到数据库 Firebase?