Sanyam Raj
Sanyam Raj

Reputation: 3

Realtime database trigger after all variables inside the trigger function get values

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);
});
      }

The code above calls the apicall() function each time a data is written on the firebase database even if all the variables don't have values . But it is required that the code for calling api,ie the apicall() function is triggered once only after all the variables have values. What can be done for that?

The database looks like this:

TtUBAOgi0aWBdPou2oCu

Facebook_Access_Token: "....kwBAHXDtyxSauOZAnzENAnA3d88Igbxxjzz2..."

Test_Score

Academics: 1

Arts: 4

Sports: 3

insta_handle: "ab"

twitter_handle: "hj"

Upvotes: 0

Views: 41

Answers (1)

Renaud Tarnec
Renaud Tarnec

Reputation: 83048

The reason is that the way you check the data is not undefined is not correct, i.e. the following code is incorrect:

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'){ 

You can declare (outside the Cloud Function) a function which checks if a variable is undefined or null, and use it as follows:

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) && ......) { 
          .....
        }
.......

Upvotes: 1

Related Questions