如果未启动Web服务器,则未定义WebSocketGateway中的命名空间

时间:2019-05-16 07:17:45

标签: nestjs

在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

0 个答案:

没有答案