доступ к БД в реальном времени из функций Firebase - PullRequest
0 голосов
/ 12 сентября 2018

Мы используем функции Firebase и базу данных Firebase в реальном времени для нашего мобильного приложения.Мы отправляем электронные письма, когда кто-то размещает заказ, который реализован с использованием триггеров БД Firebase, как показано ниже:

exports.on_order_received = functions.database.ref("/orders/{id}")
    .onCreate((change, context) => {
        console.log("start of on_order_received")   
...

Вышеупомянутый триггер прекрасно работает для нас.Теперь у нас есть некоторые требования, когда у нас нет триггера БД на рисунке.Это запрос http, как показано ниже

exports.daily_sales_report = functions.https.onRequest((req, res) => {
    //query data from firebase

Вопрос в том, как нам получить доступ к объектам БД в реальном времени?или другими словами, как мне получить доступ к узлу / orders?Я пытался, как показано ниже

exports.daily_sales_report = functions.https.onRequest((req, res) => {
    //query data from firebase
    var ref = functions.database.ref('orders')
    ref.orderByValue().limitToLast(3).on("value", function(snapshot) {
        snapshot.forEach(function(data) {
          console.log("The " + data.key + " dinosaur's score is " + data.val());
        });
    })

, но это не работает.Я получаю сообщение об ошибке «orderByValue () не является функцией»

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вам придется использовать admin, а не functions для доступа к database() для чтения данных.

(Пожалуйста, убедитесь, что у вас есть доступ к firebase-admin sdk, используйте import или require в зависимости от того, используете ли вы TypeScript или JavaScript)

// The Firebase Admin SDK to access the Firebase Realtime Database.    
import * as admin from 'firebase-admin';

или

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');

Попробуйте это:

exports.daily_sales_report = functions.https.onRequest((req, res) => {
    //query data from firebase
    /* Do not use functions */ 
    // var ref = functions.database.ref('orders')
    /* Instead use the admin */
    var ref = admin.database().ref('orders')
    ref.orderByValue().limitToLast(3).on("value", function(snapshot) {
        snapshot.forEach(function(data) {
          console.log("The " + data.key + " dinosaur's score is " + data.val());
        });
    })

orderByValue() не определен в functions.database - но фактически доступен в admin.database().ref()

0 голосов
/ 12 сентября 2018

Вы должны использовать Firebase Admin SDK .Он имеет возможность читать и писать вашу базу данных.Фактически, когда вы пишете триггер базы данных, ссылки, которые он дает вам для работы, на самом деле приходят из Admin SDK, так что это тот же API.Вам просто нужно инициализировать его самостоятельно при использовании функций типа HTTP:

// at the top of the file:
const admin = require('firebase-admin');
admin.initializeApp();

// in your function:
const root = admin.database().ref();
// root is now a Reference to the root of your database.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...