2012-09-11 40 views
2

我正在尝试使用Express,Socket.io和ntwitter模块构建一个简单的Node应用程序,因此您只需搜索一个术语(这是req。下面的params.searchTerm)和ntwitter将搜索它并通过socket.io输出流。Express/Socket.io:每个请求一个套接字的正确方法

虽然有多个窗口打开或关闭窗口,然后立即打开窗口,但我遇到了错误。有时候搜索词不会更新,有时会出现某种socket.io错误。有人能澄清正确的方式来做到这一点,或为我的错误揭示一些光?提前致谢。下面的代码。

var server = http.createServer(app); 

var io = require('socket.io').listen(server); 

server.listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

app.get('/:stream', function(req, res) { 
res.render('stream', { title: 'Search Twitter | ' + req.params.searchTerm }); 
    io.sockets.on('connection', function(socket) { 

    var publishFlag = true; 
    setInterval(function() { 
     publishFlag = true; 
    }, 1000); 

    twit.stream('statuses/filter', { track: [req.params.searchTerm] }, 
     function(stream) { 
      stream.on('data', function(tweet) { 
       if(publishFlag) { 
        socket.emit('tweet', tweet); 
        publishFlag = false; 
       } 
      }); 
     } 
    ); 
    }); 
}); 
+0

我觉得插座.io事件应该在res.render回调之外进行管理。就像现在一样,每次有人加载页面'/:stream'时,都会设置socket.io的onconnection事件。 – billy

回答

4

它认为是有点什么你正在尝试做的:

服务器端:

var server = http.createServer(app); 

var io = require('socket.io').listen(server); 

server.listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

app.get('/:stream', function(req, res) { 
res.render('stream', { title: 'Search Twitter | ' + req.params.searchTerm }); 
}); 

io.sockets.on('connection', function(socket) { 

    socket.on('stream', function(searchTerm){ 

     twit.stream('statuses/filter', { track: [searchTerm] }, 
      function(stream) { 
       stream.on('data', function(tweet) { 
        socket.emit('tweet', tweet); 
       }); 
      } 
     ); 
    }; 
}); 

客户端(/:流)

var socket = io.connect('http://localhost'); 
socket.on('tweet', addTweetOnPage); 
socket.emit('stream', searchTerm); 
+0

非常感谢 - 我会在给你绿色对号之前快速尝试一下。现在有道理。我不想让客户端发出('stream',searchTerm) – dchang

+0

我认为你试图达到的目的是让服务器在回答客户端的请求时订阅客户端,除了服务器不知道该请求与哪个socket.io客户端相关联。这就是为什么你需要客户端使用他的套接字订阅。 – billy

+0

我从头顶上写下了这个,所以它可能不是完美的 – billy

相关问题