Javascript 通过socket.io代理twitter流

Javascript 通过socket.io代理twitter流,javascript,node.js,websocket,socket.io,twitter-streaming-api,Javascript,Node.js,Websocket,Socket.io,Twitter Streaming Api,我已经用node.js设置了socket.io。我的场景是,一个用户/客户端提供了一个twitter screen\u name,然后我需要使用提供的screen\u name订阅该twitter流(出于某些愚蠢的原因,API需要用户id而不是screen\u name) 我遇到了一个序列问题,在我知道屏幕名称(以及随后的用户id)之前,我必须订阅流: 以上内容不订阅tweetstream,也不会产生错误。如果我将tweetStream代码移到socket.io之外,并硬编码一个用户id(因为它

我已经用node.js设置了socket.io。我的场景是,一个用户/客户端提供了一个twitter screen\u name,然后我需要使用提供的screen\u name订阅该twitter流(出于某些愚蠢的原因,API需要用户id而不是screen\u name)

我遇到了一个序列问题,在我知道屏幕名称(以及随后的用户id)之前,我必须订阅流:

以上内容不订阅tweetstream,也不会产生错误。如果我将tweetStream代码移到socket.io之外,并硬编码一个用户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进行比较)


下面是完整代码的示例。

问题是需要在套接字中实例化
twitter
实例。在('subscribe')回调上:

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

假设问题与获取
用户id
的代码无关,并且
数据。screen\u name
有效,则您仍在使用一个全局
tweetStream
变量,该变量将被任何新的传入订阅覆盖。@robertklep,
user\u id
screen\u name
等都是有效的。我需要能够访问连接外部的流,以检查流是否应该关闭(如果没有人在侦听)。你不能侦听每个套接字上的
断开连接
事件吗?哦,你说得对。我以为我看到了io.sockets.on('disconnect',…),但根据它的每个套接字。所以,如果我删除
tweetStream
的全局指针,它将启动并订阅?我不知道,试试看:)如果它不工作,你应该添加一些调试语句和/或错误处理程序,看看它到底从哪里开始失败。
// …
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({ … });
        // …
    });
    //…
});