어쩌다보니 NestJS 문서 컨트리뷰터가 된 myukang이라고합니다.
Nest 프레임워크에 대한 기여는 아님에도 불구하고, 제 첫 오픈소스 컨트리뷰트다보니 기분이 짜릿하네요
프로젝트를 진행하며, eventHandler에서 exception 발생 시 서버가 다운되는 문제
로 인해
OnEvent
데코레이터를 감싸서 OnSafe 데코레이터로 감싸서 사용했습니다.
import { applyDecorators, Logger } from '@nestjs/common';
import { OnEvent, OnEventType } from '@nestjs/event-emitter';
import { OnEventOptions } from '@nestjs/event-emitter/dist/interfaces';
/**
* @description OnEvent 의 경우 에러가 발생하면 서버가 멈춥니다. 이 문제를 해결하는 데코레이터입니다.
* @source 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
*/
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());
}
이와 관련해 eventEmitter측에 이슈를 남기고 답변을 받았는데,
*해당 이슈
이렇게 OnSafe 데코레이터를 따로 추가하기보다는 option을 따로 만드는게 어떠냐? 라는 maintner의 답변을 받았습니다.
그래서, 기존 option이 뭔지 찾아보던 도중..
기존에 없던 suppressErrors
라는 옵션이 추가된 것을 확인할 수 있었습니다.
maintner도 해당 플래그에 대해서는 잘 몰랐던지 다음과 같이 답변을 남겨주었습니다.
해당 플래그는 7월 16일자로 merge된 pull request에서 추가되었으나, nest의 docs레포지토리에서는 아무런 작업이 없었던 것이었습니다.
그래서 조용히... 자세하게 찾아보지 않은 저를 자책하며 issue를 닫으려는데...
🧑🏫 maintainer: 공식문서에 해당 기능 설명이 없으니, 맘편히 PR날려봐요 (다소의역)
🧑🎓 나: 오예스!
maintainer께서 저에게...PR날리라고..직접 말씀해주셨습니다...
그래서 저는 첫 오픈소스 컨트리뷰트를 공식문서 기여로 하게되었습니다! 👏
🧑🎓 오픈소스 컨트리뷰트는 첨인데, 시도해볼게요, 감사합니당!
하트까지 눌러주시는 천사..
오픈소스에 기여하는 방법자체는 자료가 너무 많아서 생략하겠습니다.
저는 오픈소스 기여할 목적으로 따로 배우진 않고, 프로젝트에 기여하는 방법 자체가 오픈소스 기여방법과 동일하게
프로세스를 밥먹듯이 해와서 그대로 적용했습니다.
변경 전, events의 docs는 다음과 같이되어있습니다.
listener 옵션에 대해서 꽤나 불친절하게 작성되어있습니다.
심지어 저 링크를 타고가면 NodeJS의 event관련 옵션만 알 수 있어서 nestjs에서 wrapping된 이벤트에 대해서는 확인하지 못하는데요, 이 문제를 해결해야 했습니다.
초안에서, maintainer의 변경사안을 받고 바꿔서...
OnEvent의 option객체를 서술하는 부분을 추가했고,
NodeJS의 Event옵션을 서술하는 OnOptions는 아래 HINT로 빼뒀습니다!