为啥最新的 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

(可以使用firebasegcloud 部署它们)。

【讨论】:

在创建新项目(firebase init)时,还需要在 init 步骤之前进行登录,以便选择项目。所以我已经登录了。但可以肯定的是,我将 firebase 工具更新到 7.2.2(还没有新版本,所以这个已经 18 天了),我按照你的建议进行了 firebase 登录。我收到一条消息说我已经登录了。所以我做了一个 firebase 服务,令人惊讶的是它现在正在工作,这是我没想到的。我也不明白,因为登录只向我显示了消息,没有启动登录程序。到目前为止,它现在对我来说就像魔术一样。【参考方案4】:

考虑设置环境变量以提供所需的凭据。

设置环境变量可让您在应用程序之外单独提供凭据,而无需在部署时更改应用程序代码。

并不是说环境变量是永久的,因此您可以在此之后覆盖或更改它们。

【讨论】:

没错,但是如果您同时使用 2 个不同的 gmail 帐户处理 2 个或更多不同的项目怎么办?您是否需要一直更改环境变量值,或者是否有其他方便的技巧可以避免这种情况。 环境变量路径仅用于您当前的终端会话。如果您需要访问不同的项目,您可以设置服务帐户来访问您的项目。您可以为两个项目使用一个服务帐号,也可以为每个项目使用一个服务帐号。

以上是关于为啥最新的 Firebase 服务不能再加载默认凭据的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Firebase 'child_added' 事件出现乱序?

unitywebplayer为啥安装了不能用

为啥注册用户未在 Firebase 中进行身份验证?为啥用户不能将产品添加到数据库 Firebase?

为啥我不能以这种方式将数据添加到 Firebase?

在最新的 Firebase 版本 (10.2.4) 中使用 Glide 和 FirebaseUI 加载图像

为啥推送通知不能在 iOS 中使用 Firebase 从设备到设备?