Как прикрепить дополнительные данные к соединению WebSocket, чтобы я мог выполнить очистку при отключении - PullRequest
0 голосов
/ 09 мая 2020

Я использую npm ws в качестве своего сервера WebSocket, используя эту реализацию:

const fs = require("fs");
const https = require("https");
const WebSocket = require("ws");

const server = https.createServer({
  cert: fs.readFileSync("./cert.pem"),
  key: fs.readFileSync("./key.pem"),
});
const wss = new WebSocket.Server({ server, clientTracking: true });

И вот мои слушатели:

wss.on("connection", function connection(ws) {
  console.log("connection");

  ws.on("close", function close(ws) {
    console.log("disconnect");
  });

  ws.on("message", function incoming(message) {
    console.log("INBOUND MESSAGE: %s", message);
    obj = JSON.parse(message);

    switch (obj.action) { ....

Я использую сервер сокетов для настройки карточная игра. Я могу прикрепить соединение ws, исходящее от on("message, к объекту (например, player[id].ws = ws), и я могу использовать эти прикрепленные данные для отправки сообщений (например, ws.send(player[id].ws, ____);)

Проблема, с которой я сталкиваюсь, заключается в том, что при разрыве соединения мне нужно очистить все игровые данные, окружающие игрока (данные игры, данные игрока и т. Д. c). Однако, когда срабатывает прослушиватель "close", данные ws не содержат никаких данных, поэтому я могу определить, кто сбросил и очистил данные?

Я хотел бы иметь возможность on("message" установите ws.playerId='ksjfej, чтобы, когда я получил ws("close", я мог использовать ws.playerId для очистки.

1 Ответ

1 голос
/ 09 мая 2020

Возможно, вы не понимаете, но внутри события close переменная ws, представляющая соединение, полностью находится в пределах области действия, если вы удалите параметр ws, который вы ошибочно объявили в обратном вызове. Итак, это сработает.

wss.on("connection", function connection(ws) {
  console.log("connection");

  // change this callback signature to remove the `ws`
  ws.on("close", function(/* no ws here */) {
    console.log("disconnect");
    // you can reference the `ws` variable from a higher scope here
    // you just have to remove it from the function parameter list here
    // because it isn't passed to the event itself.
    console.log(ws);   // this will get ws from the higher scope
  });
});
...