【问题标题】:Express/Socket.io: The right way for one socket per requestExpress/Socket.io:每个请求一个套接字的正确方式
【发布时间】:2012-09-12 06:24:08
【问题描述】:

我正在尝试使用 Express、Socket.io 和 ntwitter 模块构建一个简单的 Node 应用程序,因此您只需搜索一个术语(即下面的 req.params.searchTerm),ntwitter 将搜索它并输出通过 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;
                }
            });
        }
    );
  });
});

【问题讨论】:

  • 我认为 socket.io 事件应该在你的 res.render 回调之外进行管理。就像现在一样,每次有人加载页面 /:stream 时,您都会设置 socket.io 的 onconnection 事件。

标签: node.js express socket.io


【解决方案1】:

它认为这在某种程度上是你想要做的:

服务器端:

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);

【讨论】:

  • 非常感谢 - 在我给你绿色复选标记之前,我会快速尝试一下。现在有道理了。我没有想到让客户端发出('stream',searchTerm)
  • 我认为您试图实现的是让服务器在响应客户端的请求时订阅客户端,但服务器不知道哪个请求与哪个 socket.io 客户端相关联。这就是为什么您需要客户端使用他的套接字进行订阅。
  • 我把这个写在我的头上,所以它可能不是完美的
  • 谢谢 - 它实际上非常适合。再次感谢您解封我!我对socket.io没有准确的理解
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 2015-07-23
  • 2023-04-02
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2013-07-17
  • 2018-11-28
相关资源
最近更新 更多