iPaf
@iPaf
Android Developer

Как получить данные из Firebase Database через Firebase Admin в Firebase Functions?

Задача:
По http-триггеру Firebase Functions получить все записи в Firebase Database единожды, то есть через метод once.

Код:
const functions = require('firebase-functions');
const admin = require("firebase-admin");
const serviceAccount = require("path/to/serviceAccount.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<database>.firebaseio.com/"
});

var db = admin.database();
var ref = db.ref("/data");

exports.resend = functions.https.onRequest((request, response) => {
	return ref.once("value").then((data) => {
		console.log('done');
		response.status(200).send("OK");
	}).catch((error) => {
		console.log('error', error);
		response.status(500).send("Error");
	});
});


Суть проблемы:
Ошибка, собственно следующая: Firebase Functions обрывает связь по таймауту, думаю, что из-за невозможности получить доступ к базе, потому что ни в один из методов - then, catch - входа не выполняется и данные не достаются из базы. В инструкциях показывают код, который не содержит return ref.., но это тоже не помогает. Тестировал локально и на Google-серверах - результат один, timeout. Пробовал в ServiceAccount выдавать вручную права на запись и чтение - тоже самое. Кроме того, пробовал инициализировать admin через functions.config().firebase, что тоже никакого результата не дало.

Вопрос:
Точно ли дело в правах на чтение? Потому что запись данных проходит успешно, правда в Promise становиться не хочет, результат такой же, как при чтении - timeout. Может что-то в коде выше не так? Может есть какая-то инструкция специально под такую задачу? Или есть какие-то ограничения по организации чтения данных из базы данных в Firebase Functions? Как нужно организовать чтение из базы единожды по http-триггеру в Firebase Functions?
  • Вопрос задан
  • 2277 просмотров
Решения вопроса 1
iPaf
@iPaf Автор вопроса
Android Developer
В итоге решил создать слушателя базы отдельно от метода, который сохраняет все данные в массив, а уже по HTTP-триггеру анализировать данные в массиве. Всем спасибо! Код ниже.

ref.on("value", function(snapshots) {
	data = [];
	
	snapshots.forEach(function(record) {
		var val = record.val();
		var value = val.value;
		
		data.push({ value: value });
	});
});

exports.resend = functions.https.onRequest((request, response) => {
	var query = request.query;
	var value = query.value;

	for (var i = 0; i < data.length; i++)
	{
		var item = data[i];
		
		if (item['value'] == value)
			response.status(200).send("OK");
	}
	
	response.status(500).send("Value not found");
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы