我们有一些Cloud功能可以将通知发送给用户。 (以及其他计算其他内容的对象)。所有这些CF都使用Realtime数据库,这是我们托管所有数据的地方。
但是几天前,我们添加了新功能,可将Realtime数据库同步到Firestore中的新表中(由于db进程的迁移)
我认为这是问题所在。我们检测到某些推送没有发送给用户,某些数据没有写入适当的表中……并查看功能日志,我们得到以下信息:
Error: Can't determine Firebase Database URL.
at FirebaseDatabaseError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)
at new FirebaseDatabaseError (/srv/node_modules/firebase-admin/lib/utils/error.js:202:23)
at DatabaseService.ensureUrl (/srv/node_modules/firebase-admin/lib/database/database.js:88:15)
at DatabaseService.getDatabase (/srv/node_modules/firebase-admin/lib/database/database.js:55:26)
at FirebaseApp.database (/srv/node_modules/firebase-admin/lib/firebase-app.js:231:24)
at FirebaseNamespace.fn (/srv/node_modules/firebase-admin/lib/firebase-namespace.js:280:45)
at exports.sendCommunityMessageNotification.functions.database.ref.onWrite (/srv/index.js:348:49)
at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:131:23)
at /worker/worker.js:825:24
at <anonymous>
但是我不知道该怎么做或修改,因为我没有找到任何解决方法
这是新功能的一个小例子,而一个较旧的功能已停止工作。
const admin = require('firebase-admin');
admin.initializeApp();
const functions = require('firebase-functions');
const firestore = admin.firestore();
//NEW FUNCTION
exports.createUpToOnFirestore = functions.database.ref('/upto/{uptoId}').onCreate((snap,context) => {
.....
return firestore.collection('uptos')
.doc(uptoId)
.set(json)
}
//OLD FUNCTION
exports.sendInvitationCreated = functions.database.ref('/invitation/{invitationId}')
.onCreate((snap,context) => {
.....
...
for (var i = 0; i < Object.keys(userList).length; i++) {
const user = users[i];
const userValue = usersValues[i];
if (userValue === 3){ //Value 3 means user is Admin
adminUserId = user;
}
console.log('Getting promise of user uid=',user);
console.log('adminUserId=',adminUserId);
//HERE IS WHERE THE FUNCTIONS CRASH
AllFollowersFCMPromises[numberNotifications] = admin.database().ref(`/user/${user}/`).once('value');
numberNotifications = numberNotifications+ 1;
}
...
...
}
答案 0 :(得分:0)
您是否设置了以下环境变量?
GCLOUD_PROJECT="projectId"
GCLOUD_APPLICATION_CREDENTIALS="service_account.json"
FIREBASE_CONFIG="firebase_config.json"
服务帐户必须在gcloud中生成。
firebase_config.json 采用以下形式:
{
"databaseURL": "https://projectId.firebaseio.com",
"projectId": "projectId",
"storageBucket": "gs://projectId.appspot.com"
}
如果您想了解更多有关如何初始化admin
对象而不用担心配置的信息,请阅读以下文章:
Firebase Separating Configuration From Code
答案 1 :(得分:0)
我遇到了这个问题,经过深入研究,问题出在“ firebase-functions”导入中。
如果在调用admin.initializeApp()之后导入firebase函数,则会发生此错误。
因此,要解决此问题,您必须像这样初始化之前先导入“ firebase-functions”
//import firebase-functions first to avoid the issue
const functions = require('firebase-functions');
const admin = require('firebase-admin');
//then initialize
admin.initializeApp();
const firestore = admin.firestore();
答案 2 :(得分:0)
在初始化admin sdk时指定凭据对象时出现此错误
admin.initializeApp({credential: admin.credential.applicationDefault()});
这在本地有效,但是在我尝试执行已部署的功能时导致崩溃。 当我删除指定credentail对象时,它起作用了。 我将其更改为
admin.initializeApp()