1

我有一个使用 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);
    });
}
4

2 回答 2

1

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

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

于 2013-10-31T22:08:04.690 回答
0

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

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

然后我可以检查当前的 URL

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

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

于 2013-11-04T18:00:11.810 回答