cupicks / cupicks-be

이미지만 보고 만드는 카페 레시피 제작 및 공유 서비스
5 stars 3 forks source link

Reqeust : /api/auth/send-email 실패 시, 반환 메세지 개선 요청 #106

Closed wonseok-do closed 2 years ago

wonseok-do commented 2 years ago

제안사항

GET http://~~~~/api/auth/send-email?email=dusunax@gmail.co 500 (Internal Server Error)

console - data:{isSuccess: false, message: 'UnknownError'} -> message:"사용할 수 없는 이메일입니다" 바꿔주실 수 있나요?

환경 설정

OS: Windows 10
Node:  v16.15.1 (@unchaptered), v16.13.1(@axisotherwise)
npm : v8.11.0 (@unchaptered), v8.2.2 (@axisotherwise)
unchaptered commented 2 years ago

해당 부분 반영해서 더 직관적인 메세지가 갈 수 있게 처리해두도록 하겠습니다. 처리 완료되면 별도로 멘션 드리겠습니다.

unchaptered commented 2 years ago

조치사항

해당 부분은 AwsSesProvider.prototpye.sendVerifycode() 에서 발생하는 문제입니다. 따라서, 해당 메서드 단계에서 에러 발생 지점 을 try-catch 로 감싼 다음에 에러를 형태에 맞게 가공하는 전용 핸들러 를 등록하려고 했습니다.

이를 위해서 살펴 본, 에러의 형태는 다음과 같이 나오고 있습니다.

MessageRejected: UnknownError
    at deserializeAws_queryMessageRejectedResponse (~\project\node_modules\@aws-sdk\client-ses\dist-cjs\protocols\Aws_query.js:3560:23)
    at deserializeAws_querySendEmailCommandError (~\project\node_modules\@aws-sdk\client-ses\dist-cjs\protocols\Aws_query.js:2561:25)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async ~\project\node_modules\@aws-sdk\middleware-serde\dist-cjs\deserializerMiddleware.js:7:24
    at async ~\project\node_modules\@aws-sdk\middleware-signing\dist-cjs\middleware.js:11:20
    at async StandardRetryStrategy.retry (~\project\node_modules\@aws-sdk\middleware-retry\dist-cjs\StandardRetryStrategy.js:51:46)
    at async ~\project\node_modules\@aws-sdk\middleware-logger\dist-cjs\loggerMiddleware.js:6:22 {
  '$fault': 'client',
  '$metadata': {
    httpStatusCode: 400,
    requestId: '요청자-ID',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 요청한-숫자,
    totalRetryDelay: 0
  },
  xmlns: '요청 도메인의 버전',
  Error: {
    Type: '요청-타입',
    Code: 'MessageRejected',
    Message: 'Email address is not verified. The following identities failed the check in region 요청지역: 수신자-이메일'
  },
  RequestId: '요청자-ID'
}

이 친구를 instanceof 를 톻애서 분기처리하기 위해서 다음과 같이 2 개를 확인하였습니다.

import { MessageRejected } from "@aws-sdk/client-ses";

console.log(err instnaceof Error)                                           // true
console.log(err instanceof MessageRejected);                      // true

이 부분을 반영해서 다음과 같이 코드를 변경하였습니다.

public async sendVerifyCode(toEmail: string, emailVerifyCode: string): Promise<SendEmailCommandOutput> {
    const ses = this.getSesInstance();
    try {
        return await ses.sendEmail({ /* 설정 및 내용 */ });
    } catch (err) {
        if (err instanceof MessageRejected)
            throw new BadRequestException(`${toEmail} 은 메일 수신이 불가능한 이메일입니다.`);
        else if (err instanceof Error) throw new UnkownError(`${err.name}, ${err.message}`);
        else throw new UnkownTypeError(`알 수 없는 에러가 발생하였습니다. 대상 : ${JSON.stringify(err)}`);
    }
}
unchaptered commented 2 years ago

해결된 요청 사항입니다.