我目前正在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或更高版本上工作?
答案 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
(一个人可以使用firebase
和gcloud
来部署它们)。
答案 3 :(得分:0)
请考虑设置环境变量以提供所需的凭据。
设置环境变量使您可以与应用程序分开提供凭据,而无需在部署时更改应用程序代码。
不是说环境变量是永久变量,因此您可以在此之后覆盖或更改它们。