Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在nodeJS中使用express和socket.io时重复值_Node.js_Socket.io - Fatal编程技术网

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

Node.js 在nodeJS中使用express和socket.io时重复值,node.js,socket.io,Node.js,Socket.io,我有一个使用express和socket.io的nodeJS应用程序。我想编写一些代码,以便它只在我提供的一个页面上运行。为了做到这一点,我使用express来侦听请求并将一个html页面作为响应提供给用户 app.get('/archive', function(request, response) { response.sendfile(__dirname + "/views/table.html"); } 我还有一个socket.io函数,用于侦听数据并将其发送到html页面 i

我有一个使用express和socket.io的nodeJS应用程序。我想编写一些代码,以便它只在我提供的一个页面上运行。为了做到这一点,我使用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);
    });
}

您不应该在HTTP路由中放置Socket.IO连接侦听器。每次有连接时都会调用Socket.IO对象的
connection
事件,因此,如果每次调用HTTP路由时都创建一个新的连接侦听器,则会有重复的侦听器,这些侦听器在有连接时都会触发


如果不希望Socket.IO出现在某个页面上,请不要在该页面上包含客户端脚本。否则,另一种方法是将客户机路径存储在cookie中,并在授权期间访问该cookie。然后您可以接受或拒绝客户端。

您不应该在HTTP路由中放置Socket.IO连接侦听器。每次有连接时都会调用Socket.IO对象的
connection
事件,因此,如果每次调用HTTP路由时都创建一个新的连接侦听器,则会有重复的侦听器,这些侦听器在有连接时都会触发


如果不希望Socket.IO出现在某个页面上,请不要在该页面上包含客户端脚本。否则,另一种方法是将客户机路径存储在cookie中,并在授权期间访问该cookie。然后您可以接受或拒绝客户端。

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

var curURL = url.parse(request.url).pathname;
然后我可以检查当前的URL

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

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

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

var curURL = url.parse(request.url).pathname;
然后我可以检查当前的URL

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

至于重复值的问题,我忘了在退出时取消订阅。订阅后。取消订阅();这一切都很有效。

当我使用socket.handshake.url时,我会得到一个唯一的url(/socket.io/1/?t=128438943),而不是/path抱歉,这似乎不正确。我已经修改了答案。当我使用socket.handshake.url时,我会得到一个唯一的url(/socket.io/1/?t=128438943),而不是/path抱歉,这似乎不正确。我已经修改了答案。