在nodeJS中使用express和socket.io时重复的值

时间:2013-10-31 17:09:23

标签: node.js socket.io

我有一个使用express和socket.io的nodeJS应用程序。我想osolate一些代码,以便它只在我服务的一个页面上运行。为此,我使用express来收听请求并提供一个html页面作为回复。

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
}

我还有一个socket.io函数,用于侦听并将数据发送到html页面。

io.sockets.on('connection', function(socket) {
     channel.subscribe('cheat', function(message) {
      socket.emit('message', message);
});\

当代码是这样时,一切都运行良好但是当我尝试将socket.on函数放在app.get函数中时,我遇到了问题。第一个请求工作正常但当页面刷新时,所有数据都会重复。第一次是x2然后是x3然后是x4,依此类推。有谁知道为什么会这样?

这是我的最终代码:

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
    io.sockets.on('connection', function(socket) {
        channel.subscribe('cheat', function(message) {
        socket.emit('message', message);
    });
}

2 个答案:

答案 0 :(得分:1)

您不应该在HTTP路由中放置Socket.IO连接侦听器。每次有连接时都会调用Socket.IO对象的connection事件,因此如果每次调用HTTP路由时都创建一个新的连接侦听器,那么你将拥有重复的侦听器是一种联系。

如果您不想在某个页面上使用Socket.IO,请不要在该页面上包含客户端脚本。否则,执行此操作的另一种方法是将客户端路径存储在cookie中,并在授权期间访问该cookie。然后你可以接受或拒绝客户。

答案 1 :(得分:0)

我使用url.parse函数来获取页面的名称,如下所示:

var curURL = url.parse(request.url).pathname;

然后我可以查看当前的网址

 if (curURL == '/') {
    //code
}

至于重复值的问题,我忘记在退出时取消订阅。订阅后.unsubscribe();一切正常。