0

我有socket.io设置node.js.我的场景是一个用户/客户提供一个twitter screen_name,然后我需要使用提供的screen_name订阅该twitter流(因为API需要一个user_id而不是screen_name)。代理叽叽喳喳流通过socket.io

我碰到一个序列的问题,我要订阅流之前,我知道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和不产生错误。如果我移动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与完整的代码。

+0

假设的问题是不相关的代码获取'user_id',和'data.screen_name'是有效的,你仍然使用一个全局的'tweetStream'变量,它将被任何新的传入订阅覆盖。 – robertklep

+0

@robertklep,'user_id'和'screen_names'是有效的等我需要能够访问* connection *以外的流来检查流是否应该关闭(如果没有人正在侦听)。 – jacob

+0

你不能听每个套接字上的'disconnect'事件吗? – robertklep

回答

0

的问题是,twitter实例需要socket.on内被实例化(“订阅”)回调:

// … 
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({ … }); 
     // … 
    }); 
    //… 
});