Socket.io命名空间和空间:无法在具有令牌的特定URL上接收事件

时间:2019-04-01 11:18:23

标签: node.js socket.io namespaces

当前,我需要对nodejs服务器进行编码,以向所有拥有令牌的用户提供实时位置。所以我使用socket.io并表达。 目前,我仅在按下按钮时才发送消息,然后再开始以JSON格式发送职位。

客户端发送带有消息的事件,服务器在将新消息发送给与第一个客户端具有相同令牌的客户端之前先进行检索。

我的问题如下:我可以从客户端发送消息,但服务器无法检索相应的事件,因此无法发送其响应。 你有什么解释吗?

服务器:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = 8080;
var tokenArray = [];


app.get('/suivi/:token', function(req, res) {
    res.sendFile(__dirname + "/src/suiveur.html");
});

app.get("/createChannel/:token", function(req, res) {
    console.log(req.params.token);
    var newNamespace = io.of("/" + req.params.token);
    tokenArray.push(newNamespace);

    newNamespace.on('connection', function(socket) {
      socket.on('room', function(room) {
        socket.join(room.substring(1, room.length));
      });
    });

    newNamespace.on('afficheTest', function(msg) {
      console.log(msg);
      newNamespace.to("/" + req.params.token).emit('afficheTest', "Salut les amis");
    });

    res.send("OK");
});

//Création d'une route dynamique pour servir le css
app.get("/css/:nomFichierCss", function(req, res) {
    res.sendFile(__dirname + "/css/" + req.params.nomFichierCss);
});

//Création d'une route dynamique pour servir les scripts
app.get("/script/:nomScript", function(req, res) {
    res.sendFile(__dirname + "/script/" + req.params.nomScript);
});

http.listen(port, function(){
  console.log('listening on *:' + port);
});

客户端的辅助脚本:

window.addEventListener("load", function() {
  initMap();

  $(function() {
    localStorage.debug = '*';
    //On récupère le token
    var room = window.location.href.substring(window.location.href.lastIndexOf("/"), window.location.href.length);
    //On se connecte au bon salon
    var socket = io.connect(room);
    //On détecte un évènement indiquant que la personne a bougé
    socket.on("newPositionAppears", (tableau) => {
        if(tableau != null) {
            tableau.forEach((polyLine) => {
                //On part du principe qu'il s'agit d'un tableau de polyLine
                map.entities.push(polyLine);
            })
        }
    });

$('#affichons').on("click", function() {
    alert("Click");
    socket.emit("afficheTest", "Salut bb");
});

    socket.on("afficheTest",  function(msg) {
        console.log("Affiche Test : ");
        alert(msg)
    });
    socket.on("connect", function() {
        socket.emit("room", room);
    });
  });
});

1 个答案:

答案 0 :(得分:1)

您要混合使用2个socket.io概念:名称空间和房间。

命名空间是在客户端和服务器之间共享的概念:客户端可以决定连接到命名空间,并且只有在之前在服务器上创建了命名空间的情况下,它才有效。

另一方面,房间是仅在服务器端存在的概念:客户端可以执行某些操作,服务器将套接字放置在房间中。

在典型情况下,名称空间是静态的(例如:“ / admin”,“ / notifications”等),是在服务器启动期间创建的,而房间是动态的并且是按需创建的(例如聊天室)。

在您的情况下,可能表示以下内容:

  1. 让客户端在默认名称空间(“ /”,默认情况下已经存在)上发出一个socket.io消息。该消息可能是join,有效载荷是{ "token": <the token> }
  2. 然后,服务器应将套接字放置在相应的房间中。该房间的名称可能类似于locations-${token}
  3. 此时,您可以使用io.to('locations-1234567890').emit('new_location', { foo: 'bar' })
  4. 将消息发送到房间中的所有套接字