0

我已经用 node.js 设置了 socket.io。我的场景是用户/客户端提供一个 twitter screen_name 来关注,然后我需要使用提供的 screen_name 订阅该 twitter 流(出于某种愚蠢的原因,API 需要 user_id 而不是 screen_name)。

我遇到了一个序列问题,我必须在知道 screen_name(以及随后的 user_id)之前订阅流:

var tweetStream;

io.sockets.on('connection', function connect( socket )
{
  socket.on('subscribe', function(data)
  {
    twitter.get(
      'statuses/user_timeline',
      { "screen_name": data.screen_name },
      function getTweets( err , tweets )
      {
        // …
        // var user_id …

        tweetStream = twitter.stream('statuses/filter', { "follow": user_id });
        console.log('\n','tweetStream: ', tweetStream, '\n');

        tweetStream.on('tweet', function onTweet(tweet)
        {
          console.log( '\ntweetStream -> new tweet: ', tweet, '\n' );
          io.sockets.in( data.screen_name ).emit('tweets', tweet );
        });
      }
    );
  });
}

以上不订阅推文流,不会产生错误。如果我将 tweetStream 代码移到 socket.io 之外并对 user_id 进行硬编码(因为它不可用),它可以工作:

var tweetStream;

io.sockets.on('connection', function connect( socket )
{
  …
}

tweetStream = twitter.stream('statuses/filter', { "follow": 6253282 });
console.log('\n','tweetStream: ', tweetStream, '\n');

tweetStream.on('tweet', function onTweet(tweet)
{
  console.log( '\ntweetStream -> new tweet: ', tweet, '\n' )
  io.sockets.in( tweet.user.screen_name ).emit('tweets', data );
});

编辑

两种情况下的tweetStream对象都是相同的(通过 FileMerge 进行比较)。

这是带有完整代码的要点。

4

1 回答 1

0

问题是twitter需要在 socket.on('subscribe') 回调中实例化实例:

// …
var io      = require('socket.io').listen(server);
var Twit    = require('twit');

io.sockets.on('connection', function connect( socket )
{
    //…
    socket.on('subscribe', function subscribe( data )
    {
        var twitter = new Twit({ … });
        // …
    });
    //…
});
于 2013-12-15T22:57:34.920 回答