Google App Engine (Flex) использует сервер express вместе с отдельным сервером socket.io - PullRequest
0 голосов
/ 12 апреля 2020

Я чувствую себя по-настоящему глупо, но вот моя проблема.

Я использую Socket-Controller и routing-controller в одном приложении NodeTS. Поэтому мне нужно было создать два express сервера. Один слушает порт 3000 или что-то еще из env, а другой - порт 65080. Локально это работает отлично. Теперь в GAE мой HTTP-сервер для обычных запросов работает, в то время как мой SocketServer всегда отключается.

Если это поможет, вот мой app.yaml:

runtime: nodejs
env: flex

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
    instances: 1
resources:
    cpu: .5
    memory_gb: 0.5
    disk_size_gb: 10

network:
    session_affinity: true
    forwarded_ports:
        - 65080

env_variables:
    APP_NAME: Backend
    APP_SCHEMA: https
    APP_HOST: localhost
    APP_PORT: 3000
    APP_ROUTE_PREFIX: /api
    APP_BANNER: true
    TYPEORM_CONNECTION: postgres
    TYPEORM_USERNAME: postgres
    TYPEORM_DATABASE: db
    TYPEORM_SYNCHRONIZE: true
    TYPEORM_LOGGING: error
    TYPEORM_LOGGER: advanced-console

И я создаю SocketServer с этим:

import {MicroframeworkLoader, MicroframeworkSettings} from 'microframework-w3tec';

import {createSocketServer} from 'socket-controllers';

import {env} from '../env';

export const socketLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => {
    if (!settings) {
        return;
    }
    const io = createSocketServer(65080, {
        controllers: env.app.dirs.controllers,
        middlewares: env.app.dirs.middlewares,
    });
    settings.setData('socket_io', io);
};

Кстати, я используя этот шаблон.

Помощь приветствуется, так как это расстраивает меня. :)

РЕДАКТИРОВАТЬ: Создание второго микросервиса на самом деле не вариант, так как они разделяют слишком много, чтобы быть изолированными друг от друга. (Сервисы, Модели БД, Настройки).

РЕДАКТИРОВАТЬ: Я настроил брандмауэр с этим:

    --allow tcp:65080 \
    --target-tags websocket \
    --description "Allow websocket traffic on port 65080"

1 Ответ

1 голос
/ 13 апреля 2020

Ну, решение было довольно простым.

Мне нужно было привязать Socket Server к тому же экземпляру HTTP-сервера, который используется express. Ниже приведены мои изменения.

socketLoader.ts

const io = require('socket.io')(settings.getData('express_server'));

    useSocketServer(io, {
        controllers: env.app.dirs.controllers,
        middlewares: env.app.dirs.middlewares,
    });

Где express_server - это экземпляр сервера, возвращенный expressApp.listen (env.app.port).

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