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

- ( https://velog.io/@loakick/Nest.js-event-emitter%EC%97%90%EB%9F%AC-Error%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%98%EB%A9%B4 )

 

728x90