Триггер базы данных в реальном времени после того, как все переменные внутри функции триггера получат значения - PullRequest
0 голосов
/ 14 мая 2018
const functions = require('firebase-functions');
var admin = require('firebase-admin');
var request = require('request');
var firebase = require('firebase');

admin.initializeApp();
firebase.initializeApp();

exports.takeValues = functions.database.ref('/users/{uid}/')
.onWrite((change, context) => {

       var user_id = context.auth.uid;
       var FB_access_token = change.after.val().Facebook_Access_Token;
       var twitter_username = change.after.val().twitter_handle;
       var insta_username = change.after.val().insta_handle;
       var test_at_src = change.after.val().Test_Score.Arts;
       var test_sp_src = change.after.val().Test_Score.Sports;
       var test_ac_src = change.after.val().Test_Score.Academics;

       if( FB_access_token!==undefined||'undefined' && twitter_username!==undefined||'undefined' && insta_username!==undefined||'undefined' && user_id!==undefined||'undefined' && test_at_src!==undefined||'undefined' && test_ac_src!==undefined||'undefined' && test_sp_src!==undefined||'undefined'){ 
        apicall(user_id,FB_access_token,twitter_username,insta_username,test_ac_src,test_at_src,test_sp_src)
      }
    });

    function apicall(user_id,FB_access_token,twitter_username,insta_username,test_ac_src,test_at_src,test_sp_src){

        return new Promise((resolve, reject)=> {

           var dataString = `user_id=${user_id}&FB_access_token=${FB_access_token}&twitter_username=${twitter_username}&insta_username=${insta_username}&test_ac_src=${test_ac_src}&test_at_src=${test_at_src}&test_sp_src=${test_sp_src}`;             

            var options = {
                url: 'http://ip/api',
                method: 'POST',
                body : dataString

            };

            function callback(error, response, body) 
{
    if (!error && response.statusCode === 200)
     {
         console.log(body);
         resolve(body);
    }
}
request(options, callback);
});
      }

Приведенный выше код вызывает функцию apicall () каждый раз, когда данные записываются в базу данных firebase, даже если все переменные не имеют значений.Но требуется, чтобы код для вызова api, то есть функция apicall (), запускался один раз только после того, как все переменные имеют значения.Что для этого можно сделать?

База данных выглядит следующим образом:

TtUBAOgi0aWBdPou2oCu

Facebook_Access_Token: ".... kwBAHXDtyxSauOZAnzENAnAjzz2" ...

Test_Score

Академика: 1

Искусство: 4

Спорт: 3

insta_handle: "ab"

twitter_handle: "hj"

1 Ответ

0 голосов
/ 14 мая 2018

Причина в том, что способ проверки данных не определен неверно, т. Е. Следующий код неверен:

if( FB_access_token!==undefined||'undefined' && twitter_username!==undefined||'undefined' && insta_username!==undefined||'undefined' && user_id!==undefined||'undefined' && test_at_src!==undefined||'undefined' && test_ac_src!==undefined||'undefined' && test_sp_src!==undefined||'undefined'){ 

Вы можете объявить (вне облачной функции) функцию, которая проверяет, является ли переменная неопределенной или нулевой, и использовать ее следующим образом:

admin.initializeApp();
firebase.initializeApp();

function testIsDefined(v) {    // <- new function, returns true if not undefined and not null
   return (typeof(v) != 'undefined' && v != null)
}

exports.takeValues = functions.database.ref('/users/{uid}/')
.onWrite((change, context) => {

       var user_id = context.auth.uid;
       var FB_access_token = change.after.val().Facebook_Access_Token;
       var twitter_username = change.after.val().twitter_handle;
       var insta_username = change.after.val().insta_handle;
       var test_at_src = change.after.val().Test_Score.Arts;
       var test_sp_src = change.after.val().Test_Score.Sports;
       var test_ac_src = change.after.val().Test_Score.Academics;

       if( testIsDefined(FB_access_token) && testIsDefined(twitter_username) && testIsDefined(insta_username) && ......) { 
          .....
        }
.......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...