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与完整的代码。
假设的问题是不相关的代码获取'user_id',和'data.screen_name'是有效的,你仍然使用一个全局的'tweetStream'变量,它将被任何新的传入订阅覆盖。 – robertklep
@robertklep,'user_id'和'screen_names'是有效的等我需要能够访问* connection *以外的流来检查流是否应该关闭(如果没有人正在侦听)。 – jacob
你不能听每个套接字上的'disconnect'事件吗? – robertklep