云功能崩溃,并显示“错误:无法确定Firebase数据库URL”。

时间:2019-09-06 11:07:46

标签: node.js firebase google-cloud-functions cloud

我们有一些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;
      }
    ...
    ...
    }

3 个答案:

答案 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()