0

У меня есть socket.io с node.js. Мой сценарий - это пользователь/клиент, который предоставляет имя twitter screen_name, а затем мне нужно подписаться на этот твиттер-поток, используя предоставленное имя screen_name (по какой-то причине, для которого API требует имя_пользователя вместо имени 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); 
}); 

EDIT

В tweetStream объекты в обоих случаях идентичны (сравнивается с помощью FileMerge).

Вот Gist с полным кодом.

+0

Предполагая, что проблема не связана с кодом получение 'user_id', и 'data.screen_name' действителен, вы по-прежнему используете глобальную переменную' tweetStream', которая будет перезаписана любой новой входящей подпиской. – robertklep

+0

@robertklep, 'user_id' и' screen_names' являются действительными и т. Д. Мне нужно иметь доступ к потоку вне * соединения *, чтобы проверить, должен ли поток быть закрыт (если никто не слушает). – 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({ … }); 
     // … 
    }); 
    //… 
});