Проблемы с JS + Socket.io + Heroku - проблема с Socket.id - PullRequest
0 голосов
/ 24 ноября 2018

Решение

Изменить

var server = app.listen(3000);

На

var server = app.listen(process.env.PORT || 5000);

Я хочу развернуть на Heroku игру, созданную с использованием JavaScript.

Вот мой сервер:

var express = require('express');
var app = express();
var server = app.listen(3000);
var socket = require('socket.io');
var io = socket(server);
app.use(express.static('public'));

var connectedPlayers = {};

console.log("Server is running!");

io.on('connection',

function (socket) {

    socket.on('newPlayer',
        function (data) {
            console.log("New player connected - ID: " + data.id);
            connectedPlayers[socket.id] = {
                idOnline: socket.id,
                idOffline: data.id,
                x: data.w,
                y: data.h
            };
            socket.emit('allPlayers', connectedPlayers);
            socket.broadcast.emit('newPlayer', connectedPlayers[socket.id]);
        });

    socket.on('move',
        function (data) {
            connectedPlayers[socket.id].x = data.x;
            connectedPlayers[socket.id].y = data.y;
            socket.broadcast.emit('move', connectedPlayers[socket.id]);
        });

    socket.on('message',
        function (data) {
            message = {
                name: data.name,
                message: data.message,
                messageId: generateId()
            };
            socket.broadcast.emit('message', message);
        });

    socket.on('emote',
        function (data) {
            message = {
                emote: data.emote,
                id: socket.id
            }
            socket.broadcast.emit('emote', message);
        });

    socket.on('disconnect', function () {
        delete connectedPlayers[socket.id];
        io.emit('remove', socket.id);
    });

});

Локально с этой работой все в порядке, но при развертывании на heroku появляется следующее сообщение об ошибке:

2018-11-23T21:04:18.009491+00:00 app[web.1]: /app/server.js:33
2018-11-23T21:04:18.009512+00:00 app[web.1]: connectedPlayers[socket.id].x = data.x;
2018-11-23T21:04:18.009514+00:00 app[web.1]: ^
2018-11-23T21:04:18.009516+00:00 app[web.1]:
2018-11-23T21:04:18.009518+00:00 app[web.1]: TypeError: Cannot set property 'x' of undefined

Я понимаю, что heroku не распознаетмассив «connectedPlayers» с этим индексом, но как это может работать правильно локально?Что не так со свойством socket.id?PS: socket.id отправляется клиентом, но я думаю, что он генерируется после того, как клиент установил соединение с сервером, верно?

1 Ответ

0 голосов
/ 24 ноября 2018

После поиска множества решений я пытался сумасшедшими вещами вставить:

process.env.PORT || 5000

на server.listen.

Как вы видите в коде вопроса, я разместил устаревший код со следующей строкой (моя первая попытка):

var server = app.listen(3000);

Решение было прощечем я думал, просто изменив вышеприведенную строку кода на:

var server = app.listen(process.env.PORT || 5000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...