为什么最新的Firebase无法再加载默认凭据

时间:2019-08-16 13:47:03

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

我目前正在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)

现在,该错误为我提供了一个链接,该链接可通过在Windows中设置环境变量来帮助解决该错误(我不喜欢该变量,因为当我在不同环境中进行开发时,该变量将如何工作?项目链接到不同的gmail帐户?)

我发现但尚未测试的另一种解决方案是使用gcloud命令gcloud auth application-default login在本地进行身份验证。

作者在本教程中均未完成任何步骤。

我搜索了视频的评论,有人提到这与firebase-tools版本有关。他的解决方案是回到Firebase-tools版本6.8.0,而最新的版本是7.2.2。

所以我想知道,当Firebase工具在使用Firebase-7.2.2时将其存储在远程Firestore数据库中时,firebase-tools 7.2.2不能再运行云功能的地方已经改变了,工具6.8.0?

它是否可以像版本6.8.0一样在7.2.2或更高版本上工作?

4 个答案:

答案 0 :(得分:1)

对于有此问题的任何人,you can see my answer here

问题在于未兑现的承诺。函数一旦完成就终止,并且不等待回调,并且Firebase Cloud Functions不允许在终止后访问处理器。

答案 1 :(得分:1)

我遇到了同样的问题。如果要发布数据,则本教程的代码有效。 但是,如果要从数据库检索数据,则必须更改几行代码。

教程作者的代码:

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.docs.map(doc => {})。否则它将说“ data.map()不是函数”。

答案 2 :(得分:0)

改为使用firebase login ...参见CLI reference

(一个人可以使用firebasegcloud来部署它们)。

答案 3 :(得分:0)

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

设置环境变量使您可以与应用程序分开提供凭据,而无需在部署时更改应用程序代码。

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