Невозможно определить URL базы данных Firebase при попытке прочитать базу данных Firebase из функции Node.js Firebase - PullRequest
0 голосов
/ 12 июня 2019

Я использую Flutter для создания приложения, которое обращается к базе данных Firebase.Все хорошо со стороны Flutter .... но я новичок в Node.js и облачных функций.Я пытаюсь создать функцию Node.js, чтобы реагировать на событие удаления записи на одном узле базы данных Firebase, а затем удалять записи из двух других узлов базы данных Firebase и файлов изображений из Firestore.

Я реагирую насобытие триггера с вызовом functions.database.onDelete, не проблема, но падает на следующее препятствие, пытаясь прочитать admin.database для получения снимка.

Я создал фиктивную функцию, которая использует .onUpdate для выборавверх по событию триггера (не хочу повторять необходимость повторного создания моих данных, как если бы я использовал .onDelete), а затем пытается прочитать мою базу данных Firebase для доступа к другому узлу.Событие триггера подобрано нормально, но у меня, похоже, нет ссылки на базу данных Url для чтения ... но это та же база данных.Вывод в журнал консоли при вызове process.env.FIREBASE_CONFIG показывает, что URL-адрес присутствует.

Включенный код функции также содержит комментарии для отображения различных выводов, которые я получаю в журнале консоли.

Iсхожу с ума от этого ..... ПОЖАЛУЙСТА может кто-нибудь сказать мне, где я иду не так.Поиск в Google, Stackoverflow, Firebase документациях за последние два дня: - (


const admin = require("firebase-admin"); // Import Admin SDK
const functions = require("firebase-functions"); // Import Cloud Functions

admin.initializeApp({
  credential: admin.credential.cert(
    require("./user-guy-firebase-adminsdk.json")
  )
});

exports.testDeleteFunction = functions.database
  .ref("/user-guys/{userGuyId}")
  // Using .onUpdate as I don't want to keep restoring my data if I use .onDelete
  .onUpdate((snapshot, context) => {

    const userData = snapshot.after.val();
    const userId = userData.userId;

    console.log('userId: ' + userId);         // Gives correct console log output: userId: wajzviEcUvPZEcMUbbkPzcw64MB2

    console.log(process.env.FIREBASE_CONFIG);
    // Gives correct console log output:
    // {"projectId":"user-guy","databaseURL":"https://user-guy.firebaseio.com","storageBucket":"user-guy.appspot.com","cloudResourceLocation":"us-central"}


    // I have tried each of the four following calls and received the console log message as indicated after each.
    // 
    // var root = admin.database.ref();       // Console Log Message: TypeError: admin.database.ref is not a function
    // var root = admin.database().ref();     // Console Log Message: Error: Can't determine Firebase Database URL.
    // var root = admin.database.ref;         // Fails at line 31 below with the message indicated.
    // var root = admin.database().ref;       // Console Log Message: Error: Can't determine Firebase Database URL.

    console.log(root.toString);               // Console Log Message: TypeError: Cannot read property 'toString' of undefined.

    // This is intended to read a chat thread for two users but processing never gets here.
    var database = root.child('chats').child('0cSLt3Sa0FS26QIvOLbin6MFsL43GUPYmmAg9UUlRLnW97jpMCAkEHE3');

    database
      .once("value")
      .then(snapshot => {
        console.log(snapshot.val());
      }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
      });
    return null; // Will do stuff here once working.
  });

Сообщения об ошибках, показанные в комментариях к коду.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

См .:

Попробуйте выполнить инициализацию без параметров.

SDK также можно инициализировать без параметров.В этом случае SDK использует учетные данные приложения Google по умолчанию и считывает параметры из переменной среды FIREBASE_CONFIG.Если содержимое переменной FIREBASE_CONFIG начинается с {, оно будет проанализировано как объект JSON.В противном случае SDK предполагает, что строка - это имя файла JSON, содержащего параметры.

const admin = require("firebase-admin"); // Import Admin SDK
const functions = require("firebase-functions"); // Import Cloud Functions

admin.initializeApp();
1 голос
/ 12 июня 2019

Если вы хотите использовать конфигурацию в FIREBASE_CONFIG, вы должны инициализировать Admin SDK без параметров:

admin.initializeApp();

При этом будет использоваться учетная запись службы по умолчанию для вашего проекта, которая должна иметь полный доступ для чтения и записи в базу данных.

...