сокет.проблема ввода-вывода с node.js / express.js

#node.js #socket.io #express

#node.js #socket.io #выразить

Вопрос:

Я немного играю с node.js и socket.io . Это фрагмент кода, который я пишу:

 app.get('/play', function (req, res) {
//some code you don't need to see
var gameMessage = io.of('/game' gameId);
});
  

Все импортировано правильно. gameId правильно установлена и io переменная правильно инициализирована.
При запуске этого кода (при попытке получить доступ к localhost / play) Я получаю эту ошибку:

 TypeError: Converting circular structure to JSON
    at Object.stringify (native)
    at Array.<anonymous> (/path/to/my/game/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:74:31)
    at EventEmitter._tickCallback (node.js:126:26)
  

Если я закомментирую var gameMessage строку кода, я не получу ошибку. Итак, это порождает его.

Я бы хотел, чтобы эта строка оставалась там, потому что она создает экземпляр канала, который мне нужен. Таким образом, два человека могут играть вместе в мою игру. Если я не создам этот экземпляр и попытаюсь запустить некоторый код на стороне клиента, например

 var chat = io.connect('http://localhost/chat'   gameId);
        chat.emit('guess', {
            guess: "ciao"
        });
        chat.on('guess', function (data) {
            alert(data);
        });
  

Я получаю бесконечный цикл ошибок в консоли, когда подключается второй игрок.

Может кто-нибудь догадаться, что с этим не так? Спасибо.

Ответ №1:

То, что вы делаете, неправильно, вы не должны помещать этот сокет.Ввод кода ввода-вывода в ваш маршрут, Express.js приложения и сокет.Приложения ввода-вывода не «подключаются» подобным образом.

Создайте отдельный файл с вашим сокетом.Сервер ввода-вывода, затем используйте socket.io-client, когда вы хотите подключиться к сокету.Ввод-вывод (со стороны сервера ИЛИ клиента), например, для отправки сообщения.

Комментарии:

1. Я хотел бы иметь отдельный канал для каждой пары игроков, но эти каналы будут создаваться по мере подключения двух игроков. Возможно ли сделать что-то подобное?

2. Вы можете сделать что-то еще, заставить каждого пользователя подключаться к его каналу. Например, когда «Алекс» отправляет сообщение «Джиму», «Джим» получит сообщение, потому что он прослушивает канал «Jim», и наоборот.