Пространства имен Socket.io и комната: не может получить событие по определенному URL с токеном - PullRequest
1 голос
/ 01 апреля 2019

В настоящее время мне нужно кодировать сервер 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 Ответ

1 голос
/ 01 апреля 2019

Вы смешиваете 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' })
...