Search code examples
javascriptfirebasetwittergoogle-cloud-functions

Firebase Function won't return data?


I'm trying to make a HTTPS Callable function that gets Tweets from a user.

In my app:

const getTweets = firebase.functions().httpsCallable('getTweets');

getTweets({
    username: 'someUsername',
})
.then(res => console.log(res))
.catch(e => console.log(e));

But no data is returned... I get a empty object {data: null}

This is the function:

exports.getTweets = functions.https.onCall(async (data, context) => {
    const Twitter = require('twitter');

    const client = new Twitter({
        consumer_key: functions.config().twitter.api_key,
        consumer_secret: functions.config().twitter.api_secret_key,
        access_token_key: functions.config().twitter.access_token,
        access_token_secret: functions.config().twitter.access_token_secret,
    });

    const params = { screen_name: data.username };

    // ======== I've tried this: ======== 
    return client.get('statuses/user_timeline', params, (error, tweets, response) => {
        if (!error) {
            console.log(tweets);
        }
    });

    // ======== And this: ======== 
    client.get('statuses/user_timeline', params, (error, tweets, response) => {
        if (!error) {
            console.log(tweets);
            return tweets;
        }
    });
});

Solution

  • The could be surrounding the use the callback style client.get. Instead try returning a Promise. Promise is natively available without any additional libraries:

    exports.getTweets = functions.https.onCall(async (data, context) => {
      const Twitter = require('twitter');
    
      const client = new Twitter({
          consumer_key: functions.config().twitter.api_key,
          consumer_secret: functions.config().twitter.api_secret_key,
          access_token_key: functions.config().twitter.access_token,
          access_token_secret: functions.config().twitter.access_token_secret,
      });
    
      const params = { screen_name: data.username };
    
      return new Promise((resolve, reject) => {
        client.get('statuses/user_timeline', params, (error, tweets, response) => {
          if (error) {
            // Make sure to reject to avoid leaving it hanging in case of error
            return reject(error);
          }
    
          return resolve(tweets);
        });
      });
    });
    

    Hopefully that helps!