Nest.js
NestJS event-emitter 사용시 런타임 에러 발생시 서버 중단 현상 최근에 패치됨
Dev갱이
2024. 8. 31. 20:45
728x90
해당 이슈를 확인 해보면 수정 된것을 알 수 있다.
- ( https://github.com/nestjs/event-emitter/pull/936/commits/e322cb820f528640545e2e5685bdb141bfdc9142 )
- ( https://github.com/nestjs/event-emitter/releases/tag/2.0.2 )
버전 릴리즈를 살펴보면 해당 936 Pr이 2.0.2에 반영된것을 알 수있다.
그렇기 때문에 @nestjs/event-emitter 사용시 >=2.0.2 로 버전업 되어 있는지 체크하고 사용해야 한다.
2.0.2 이전버전을 사용하게 된다면
@OnEvent('event.fired', { async: true })
public async handleEvent(event: Event) {
throw new Error('Event Error Fired!')
}
// on-safe-event.decorator.ts
import { applyDecorators, Logger } from '@nestjs/common'
import { OnEvent, OnEventType } from '@nestjs/event-emitter'
import { OnEventOptions } from '@nestjs/event-emitter/dist/interfaces'
function _OnSafeEvent() {
return function (target: any, key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value
const metaKeys = Reflect.getOwnMetadataKeys(descriptor.value)
const metas = metaKeys.map((key) => [key, Reflect.getMetadata(key, descriptor.value)])
descriptor.value = async function (...args: any[]) {
try {
await originalMethod.call(this, ...args)
} catch (err) {
Logger.error(err, err.stack, 'OnSafeEvent')
}
}
metas.forEach(([k, v]) => Reflect.defineMetadata(k, v, descriptor.value))
}
}
export function OnSafeEvent(event: OnEventType, options?: OnEventOptions | undefined) {
return applyDecorators(OnEvent(event, options), _OnSafeEvent())
}
@OnSafeEvent('event.fired', { async: true })
async handleEvent(event: Event) {
throw new Error('Event Error Fired!')
}
@Timeout(3000)
async handleTimeout() {
this.eventEmitter.emit('event.fired')
}
@Timeout(4000)
async handleTimeout2() {
this.eventEmitter.emit('event.fired')
}
이러한 Event 데코레이터를 수정 해주어야 한다.
Reference
728x90