在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