在nodeJS中使用express和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); });\ 

当代码是这样的时候,一切运行良好,但只要我尝试并将app.get函数中的socket.on函数放在我有问题。 第一个请求完美地工作,但是当页面刷新时,所有的数据都被复制。 第一次是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); }); } 

你不应该在HTTP路由中放置一个Socket.IO连接监听器。 每次有连接时都会调用Socket.IO对象的connection事件,所以如果每次调用HTTP路由时都创build一个新的连接监听器,那么将会有重复的监听器,这些监听器在连接时都会触发。

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

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

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

然后我可以检查当前的url

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

至于重复值的问题,我忘了退出退订。 after subscription.unsubscribe(); 这一切工作。