не в состоянии писать в базе данных реального времени Firebase - PullRequest
0 голосов
/ 08 июня 2018
  exports.sendBigQueryData = 
  functions.analytics.event('buy_from_shop').onLog((event) => {
  const bigQuery = bigquery({ projectId:  });
  bigQuery.query({
  query: 'select email from table',
  useLegacySql: false
        }).then(function (results) {
        console.log(results);
        var ref = admin.database().ref("BigQueryData");// this should 
       //create a node with name BigQueryData and store the emails 
            there!

        var rows = results[0]; //get all fetched table rows
         rows.forEach(function(row){ //iterate through each row
            ref.push().set({ 
                email:row['email']


            });
        });
        //return result
    });
     {
      console.log(email,points);
      return 0;
       }
  });

Я пытаюсь добавить электронную почту в базу данных Firebase в реальном времени, но не могу.Может ли кто-нибудь помочь мне сделать это правильно?

1 Ответ

0 голосов
/ 08 июня 2018

Следующий код должен работать.В облачной функции, запускаемой фоновым событием, вы должны вернуть обещание (или, в некоторых случаях, значение, например, return false;).

Кроме того, поскольку вы несколько раз пишете в базу данных с помощью forEach()вы не можете использовать метод set() несколько раз по одной и той же ссылке, потому что вы будете перезаписывать каждую предыдущую запись.Вы должны использовать метод update() (документ здесь ).

  exports.sendBigQueryData = 
  functions.analytics.event('buy_from_shop').onLog((event) => {
      const bigQuery = bigquery({ projectId:  });

      return bigQuery.query({   // <- here add a return
        query: 'select email from table',
         useLegacySql: false

      }).then(function (results) {
         console.log(results);
         //.....

         let updates = {};

         const rows = results[0]; //get all fetched table rows
         rows.forEach(function(row){ //iterate through each row
            const newPostKey = admin.database().ref().child('BigQueryData').push().key;

            updates['/BigQueryData/' + newPostKey] = {email:row['email']};
        });

        return admin.database().ref().update(updates); // <- we return a promise

    }).catch(function (err) { // <- You have to catch the possible errors as well
       console.log(err);  
    });
  });

Наконец, я бы посоветовал вам посмотреть следующие два видео от команды Firebase, в которых подробно рассказывается, какДолжны быть написаны облачные функции, и в частности тот факт, что вы должны возвращать обещания:

https://www.youtube.com/watch?v=7IkUgCLr5oA

https://www.youtube.com/watch?v=652XeeKNHSk

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

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