繁体   English   中英

Firebase Function 不会返回数据?

[英]Firebase Function won't return data?

我正在尝试制作一个 HTTPS Callable function 来获取用户的推文。

在我的应用程序中:

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

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

但是没有返回数据...我得到一个空的 object {data: null}

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

似乎是一个异步问题,您可以改用Promisehttps://www.npmjs.com/package/twitter#promises ):

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

    try {
        return client.get('statuses/user_timeline', params);
    } catch (err) {
        console.log(err);
    }
});

可以围绕使用回调样式client.get 而是尝试返回Promise Promise本身就可用,无需任何额外的库:

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

希望这会有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM