Reputation: 3
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
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