функции firebase перестали работать после iam

Я пытаюсь сделать что-то абсурдно простое, но вся эта неверная конфигурация IAM, базы данных в реальном времени и облачных функций заставляет меня тратить часы работы на что-то простое, вроде приветственного мира.

У меня уже есть заполненная база данных (более 300 наименований):

введите описание изображения здесь

тогда у меня есть следующая функция, развернутая в облаке firebase:

const actions = [];
const igDatabase = require('firebase-admin').initializeApp({
   serviceAccountId: '[email protected]'
}).database("https://igibo-b0b27.firebaseio.com/");

let lastMapRefresh = 0;
let lastUpdateFirebase = 0;

function refreshActions(afterRefresh) {
   console.log("refreshing actions");
   igDatabase.ref('actions/').orderByChild('timestamp').startAt(lastMapRefresh).once('value').then(function(data) {
      if (data != null && data.exists()) {
         let bef = actions.length;
         actions.length = 0;
         actions.push(data.val());

         lastMapRefresh = new Date().getTime();        
         afterRefresh();
      }
      console.log("actions refreshed before: " + bef + " now: " + actions.length);
   }).catch(function(error) {
      console.error("Error: " + JSON.stringify(error));
   });
}

exports.decrementAction = (req, res) => {
refreshActions(function() {});
}

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

правила firebase для этого узла:

{
   "rules":{

      "actions":{
         ".indexOn":[
            "timestamp"
         ],
         ".read":"auth != null",
         "$act":{
            "countdown":{
               ".write":"auth != null && data.val() - newData.val() == 1 && newData.val() >= 0"
            }
         }
      }
}
}

так что ЛЮБОЙ, вошедший в систему, может читать

в консоли Google IAM у меня есть  введите описание изображения здесь

поэтому учетная запись службы должна иметь полномочия администратора для базы данных ...

но при запуске этой функции ВСЕГДА ВОЗВРАЩАЕТСЯ NULL data

Почему?




Ответы (1)


Ваш код не отправляет ответ клиенту. Вот ваша функция:

exports.decrementAction = (req, res) => {
    refreshActions(function() {});
}

Ни разу он не использует res для отправки ответа. После 60 секунд по умолчанию он всегда будет ждать, пока вы не позвоните res.send() или что-то подобное.

Я предлагаю просмотреть документацию по триггерам HTTP, чтобы узнать, как отправить ответ. Я предполагаю, что ваша (в настоящее время пустая) функция обратного вызова должна это сделать, в зависимости от того, что refreshFunctions ей доставляет.

person Doug Stevenson    schedule 16.03.2020