У меня есть 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 с полным кодом.
Предполагая, что проблема не связана с кодом получение 'user_id', и 'data.screen_name' действителен, вы по-прежнему используете глобальную переменную' tweetStream', которая будет перезаписана любой новой входящей подпиской. – robertklep
@robertklep, 'user_id' и' screen_names' являются действительными и т. Д. Мне нужно иметь доступ к потоку вне * соединения *, чтобы проверить, должен ли поток быть закрыт (если никто не слушает). – jacob
Вы не можете слушать события 'disconnect' на каждом сокете? – robertklep