2012-09-11 43 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

相關問題