0

node.jsでsocket.ioをセットアップしました。私のシナリオでは、ユーザー/クライアントがフォローする Twitter screen_name を提供し、提供された screen_name を使用してその Twitter ストリームを購読する必要があります (なんらかの理由で、API には screen_name ではなく user_id が必要です)。

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 で比較)。

完全なコードを含むGistを次に示します。

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 に答える