В моем приложении 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