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を次に示します。