Функция Firebase не выполнена - PullRequest
0 голосов
/ 01 февраля 2019
import * as functions from 'firebase-functions';

console.log('I am a log entry0!');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
console.log('I am a log entry1!');

export const onMessageCreate = functions.database
.ref('/users/{userId}/totalScore')
.onUpdate((change) => {
    console.log('I am a log entry2!');
    //var a = admin.firestore().collection('/users');
})

Я развернул функцию и вижу ее в консоли.Но функция не выполняется, когда totalScore обновляется в базе данных ....

enter image description here

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

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

Будет работать следующий код:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.onMessageCreate = functions.firestore
  .document('users/{userId}')
  .onUpdate((change, context) => {
    // Get an object representing the document
    const newValue = change.after.data();

    // ...or the previous value before this update
    const previousValue = change.before.data();

    if (newValue.totalScore !== previousValue.totalScore) {
      console.log('NEW TOTAL SCORE');
    }

    return null;

    //I guess you are going to do more than just logging to the console.
    //If you do any asynchronous action, you should return the corresponding promise, see point 3 below

    //For example:
    //if (newValue.totalScore !== previousValue.totalScore) {
    //    return db.collection("score").doc(newValue.name).set({score: newValue.totalScore});
    //}

  });

Обратите внимание:

  1. Вы не можетевызвать облачную функцию onUpdate при изменении определенного поля документа.Облачная функция будет запускаться при изменении любого поля документа Firestore.Но вы можете определить, какие поля изменились, как показано в приведенном выше коде.
  2. Начиная с версии 1.0 вам нужно инициализировать с помощью admin.initializeApp();, см. https://firebase.google.com/docs/functions/beta-v1-diffList
  3. Вам необходимоукажите платформе, когда облачная функция завершила выполнение: поскольку вы не выполняете никаких асинхронных операций в своей облачной функции, вы можете использовать return null;.(Для более подробной информации по этому вопросу, я бы посоветовал вам посмотреть 3 видео о «Обещаниях JavaScript» из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/).
0 голосов
/ 01 февраля 2019

Если вы используете Cloud Firestore, значит ваш слушатель неверен.В вашем случае вы указываете слушателя для базы данных в реальном времени.Мы извлекаем firestore из функций и указываем путь к документу, к которому мы хотим подключить слушателя:

import * as functions from 'firebase-functions';

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

export const onMessageCreate = functions.firestore
.document('users/{userId}')
.onUpdate((change, context) => {
    console.log(change.before.data()); // shows the document before update
    console.log(change.after.data()); // shows the document after change
    return; 
})
0 голосов
/ 01 февраля 2019

Я думаю, что обновление проверено на ссылке, а не на дочернем. Попробуйте это

export const onMessageCreate = functions.database
.ref('/users/{userId}')
.onUpdate((change) => {
    console.log('I am a log entry2!');
    //var a = admin.firestore().collection('/users');
})

Вы получите старые и новые значения снимка в этом месте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...