Функция узла js не может остановить выполнение - PullRequest
0 голосов
/ 07 сентября 2018

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

exports.indexlisting_algolia = 
 functions.database.ref('/Listings/{listingId}')
  .onWrite((change, context) => {
    const index = algolia.initIndex('Listings');
    const before = change.before;  // snapshot before the update
    const after = change.after;    // snapshot after the update
    const before_data = before.val();
    const after_data = after.val();
    after_data.objectID = context.params.listingId;
    console.log(Date.now());
            console.log(context)

return index.saveObject(after_data)

 .then(
  () => change.after.ref.child('last_index_timestamp').set(

     Date.parse(context.timestamp)));


}) 

функция работает, но она не останавливается, просто повторяется снова и снова. Что не так и как я могу это исправить?

1 Ответ

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

Делая change.after.ref.child('last_index_timestamp').set(), вы пишете ссылку, которую слушаете в своей облачной функции. Таким образом, облачная функция запускается автоматически.

Вы должны проверить в начале функции, нужно ли ее выполнять или нет.

Скорее всего, вы бы проверили, существует ли last_index_timestamp или имеет конкретное значение, используя change.before.val() и / или change.after.val().

Если вы хотите остановить выполнение функции, просто верните null.

См. Следующий официальный образец для примера этой "методики" (строки с 30 по 32) https://github.com/firebase/functions-samples/blob/952fe5d08c0a416f78def93fa337ca2bd73aedcf/message-translation/functions/index.js


Последнее (важное) замечание: вы должны вернуть обещание, возвращенное методом set(), а также отловить возможные ошибки следующим образом:

 return index.saveObject(after_data)
 .then(
  () => return change.after.ref.child('last_index_timestamp').set(Date.parse(context.timestamp))
 )
 .catch(err => {
    console.log('Error:', err);
    return false;
  });

Я бы посоветовал вам посмотреть следующую официальную серию видео "Изучение функций облака для Firebase" (см. https://firebase.google.com/docs/functions/video-series/), и, в частности, три видео под названием "Изучите обещания JavaScript", в которых объясняется, как и почему мы должны объединить и возвращать обещания в вызванных событиями облачных функциях.

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