Пространство имен в WebSocketGateway не определено, если веб-сервер не запущен - PullRequest
0 голосов
/ 16 мая 2019

В моем приложении NestJS я не могу запускать события сокетов, если контекст приложения NestJS не «слушает».запущен.

Итак, мой вопрос: можно ли запустить просто сервер веб-сокета при создании приложения NestJS без запуска всего HTTP-сервера?

Некоторая справочная информация:

В нашем приложении у нас есть наш сервер и планировщик заданий.Планировщик заданий используется для управления заданиями каждую минуту.

Планировщик заданий должен иметь как можно меньше накладных расходов.Поэтому запуск экспресс-HTTP-сервера в этом приложении не идеален.Поэтому я бы хотел этого избежать.

До сих пор я создавал приложение NestJS планировщика заданий, например:

const app: INestApplicationContext = await NestFactory.createApplicationContext(ApplicationModule);
// Do some logic
const userCoreService = app.select(UserModule).get(UserCoreService);
const users = userCoreService.getUsers();
const socketServer = app.select(SocketModule).get(DefaultGateway);
socketServer.emitToUsers(users.map((u) => u.id), 'myevent', {some: 'data'})

Внутри моего шлюза Socket:

@WebSocketGateway({
    namespace: SocketNamespace.Default
})
export class DefaultGateway implements OnGatewayInit, OnGatewayConnection {
    protected namespace: SocketIO.Namespace;
    public afterInit(namespace: SocketIO.Namespace): void {
        console.log('XXX');
        this.namespace = namespace;
    }

    public emitToUsers(userIds: Array<string>, event: string, data: any): void {
        for (let i: number = 0; i < userIds.length; i++) {
            this.namespace.to(userIds[i]).emit(event, data);
        }
    }
}

Итакпроблема внутри создания контекста моего приложения, если я специально не вызываю этот метод:

await app.listen(3000);

Точно такой же код выдаст исключение:

komed-job-scheduler       | (node:26) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'to' of undefined
komed-job-scheduler       |     at DefaultGateway.emitToUsers (/home/app/src/socket/socket-base.ts:39:28)
komed-job-scheduler       |     at PatientCoreService.<anonymous> (/home/app/src/patient/patient.core.service.ts:227:29)
komed-job-scheduler       |     at Generator.next (<anonymous>)
komed-job-scheduler       |     at fulfilled (/home/app/src/patient/patient.core.service.ts:13:58)
komed-job-scheduler       |     at <anonymous>
komed-job-scheduler       |     at process._tickCallback (internal/process/next_tick.js:189:7)

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

PS: мы используем NestJS v4

...