【问题标题】: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 看到我的回答,希望对你有所帮助!

标签: javascript firebase google-cloud-functions firebase-cli


【解决方案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 个或更多不同的项目怎么办?您是否需要一直更改环境变量值,或者是否有其他方便的技巧可以避免这种情况。
      • 环境变量路径仅用于您当前的终端会话。如果您需要访问不同的项目,您可以设置服务帐户来访问您的项目。您可以为两个项目使用一个服务帐号,也可以为每个项目使用一个服务帐号。
      猜你喜欢
      • 2020-04-28
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多