Node.js & socket.IO на ошибку Heroku - PullRequest
0 голосов
/ 28 сентября 2019

Сервер, размещенный на бесплатной Dyno HEROKU, с бесплатной PSQL HEROKU.

Соединение с SocketIO с использованием экспресс:

    const port: number = parseInt(process.env.PORT || process.env.GAMESERVER_PORT || "NaN", 10);
    if (isNaN(port)) {
        throw Error("Invalid GAMESERVER_PORT number");
    }
    const app = require('express')();
    const server = require('http').Server(app);
    export const io = require('socket.io')(server);
    server.listen(port);
    console.log('listening on', port);

    When client is connected (using Unity SocketIO), it send thoses data : the firebase ID of the player.

            Tools.GetSocket().On("connect", (E) =>
            {
                JSONObject data = new JSONObject();
                data.AddField("fb_id", PlayerPrefs.GetString("password"));
                Tools.GetSocket().Emit("auth:token", data);
            });

Затем сервер обновляет socket_id учетной записи, связанной с этим идентификатором firebase..

    socket.on('auth:token', async function (data: JSON) {
                if (data['fb_id'] != '' && data['fb_id'] != null && !isUndefined(data['fb_id'])) {
                    let account: Account | null = await AccountRep.findOne({ fb_id: data["fb_id"] });
                    if (account != null) {
                        if (account.socket_id != null && account.socket_id != socket.id) 
            socket.to(account.socket_id).emit('kick');
                        if (account.socket_id != socket.id) account.socket_id = socket.id;                    
                    }
                    else socket.emit('err', { code: 'log:error', message: 'firebase ID is null' });                
          getConnection('Accounts').manager.save(account);

И все это работает хорошо до конца этого сценария: когда идентификатор сокета обновляется на нужной учетной записи, я затем отправляю обратно клиенту «Хорошо, у вас есть пользователь этого сервера, а ты автолог на этом сервере!»

в этой части после нескольких повторных подключений останавливается выполнение

           let user_callisto: number = await getConnection('Callisto').manager.getRepository(User).createQueryBuilder('user')
                    .where('fb_id = :fbid', { fbid: account.fb_id})
                    .getCount();
                let user_oberon: number = await getConnection('Oberon').manager.getRepository(User).createQueryBuilder('user')
                    .where('fb_id = :fbid', { fbid: account.fb_id })               
                    .getCount();

                class Servers {
                    callisto: boolean;
                    oberon: boolean;
                    code: string;
                    autoload: string;
                    pseudo: string;
                }
                let server: Servers = new Servers();

                server.code = 'authentificated';
                server.callisto = user_callisto != 0;
                server.oberon = user_oberon != 0;
                if (account.server_focus == 'oberon' && !server.oberon) account.server_focus = '';
                if (account.server_focus == 'callisto' && !server.callisto) account.server_focus = '';
                if (account.server_focus != 'oberon' && account.server_focus != 'callisto') account.server_focus = '';
                server.autoload = account.server_focus;

                socket.emit('logged', server);

И затем клиент получает уведомление о том, что он может запросить все данные с определенного сервера.

      
    Tools.GetSocket().On("logged", (E) =>
    {
        SERVER servers = JsonUtility.FromJson<SERVER>(E.data.ToString());

        if (servers.autoload != "")
        {
            JSONObject data = new JSONObject();
            data.AddField("server", servers.autoload);
            Tools.GetSocket().Emit("load:server", data);
        }
    });

И сервер отправит все необходимые данные с этого сервера на этот клиент.

Это работает хорошо, но если я закрою и создаю определенное количество соединений (около 10), токод останавливается: я все еще подключаюсь к сокету и отправляю информацию о FireBase ID.Сервер получает его, но останавливается, когда ему нужно выбрать пользователей из разных серверов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...