[TIL] trello 프로젝트 중 여러 자잘한 에러들

최하온·2024년 3월 22일
0

TIL

목록 보기
53/71
post-thumbnail

1) nodemailer, 이메일 인증 관련


🚨Issue occuring

회원 가입 중 이메일 인증 메일 전송 후 인증을 하지 않은 상태로 API 요청이 time out이 되었을 때 rollback이 되지 않고 DB에 저장이 됨

💦What I tried


1) mysql 자체의 wait_timeout 사용💦

#TRY
function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(new Error('요청 시간 초과'));
        }, ms);
    });
}

async function sendEmailWithTimeout(email) {
    try {
        await Promise.race([
            this.mailerService.sendEmail(email),
            timeout(5000) // 5초 후 타임아웃
        ]);
        // 성공적으로 이메일 전송
    } catch (error) {
        // 타임아웃 또는 이메일 전송 실패 처리
        console.error(error);
        throw error;
    }
}

새로운걸 배워서 신기하고 좋았으나 사용법 미숙으로 인한 근본적인 문제는 해결하지 못함

2) create → sendEmail → save순으로 로직 순서 변경💦

  • sendEmail 로직
    • 1) 메일을 전송
    • 2)DB에 이메일 여부 check → 없을 시 flag를 ‘no exists’ 로 반환
    • 3) flag 값에 맞는 case로 결과 반환

📃 user가 없으니 error 발생! -> sendEmail내의 User Check 로직 삭제

# AS-IS
const isExpired = NOW - time > EXPIRED_TIME;
      if (isExpired) {
        flag = 'expired';
      }
      const user = await this.userService.findByEmail(email);
      if (user) {
        resolver(true);
        flag = 'success';
      } else {
        flag = 'no exists';
      }
      
# TO-BE
const isExpired = NOW - time > EXPIRED_TIME;
      if (isExpired) {
        flag = 'expired';
      } else {
        flag = 'success';
        resolver(true);
      }

2) Guards 관련

🚨Issue occuring

@UseGuards(AuthGuard('jwt'))를 통과하지 못하는 문제 발생
=> 올바른 guard를 주지 못하니 UserInfo도 읽어오지 못하고 null이 반환

💡How solve issue


#AS-IS
  verifyToken(token: string) {
    return this.jwtService.verify(token, { secret: JWT_SECRET_KEY });
  }
-------------------------------------------------------
   JwtModule.registerAsync({
      useFactory: (config: ConfigService) => ({
        secret: config.get<string>('JWT_SECRET_KEY'),
      }),
      inject: [ConfigService],
    })
 #TO-BE    
   verifyToken(token: string) {
    return this.jwtService.verify(token);
  }
  • 팀원들과의 열띤 토론 끝에 찾음.

📃 Module에서 이미 ('JWT_SECRET_KEY')를 주었으므로 개별적으로 주지 않아도 되었고, 읽어오지 못하는 모습을 보고 .env와는 별도로 다른 파일을 만들어 경로를 받고있었음.

2) 의존성 주입 관련

🚨Issue occuring

user service 내에 첫 번째 생성자인 @Inject(CACHE_MANAGER) private readonly cacheManager: Cache 를 찾지 못함.

[Nest] 15476  - 2024. 03. 22. 오후 11:43:41
ERROR [ExceptionHandler] Nest can't resolve dependencies of the UserService (?, UserRepository).
Please make sure that the argument "CACHE_MANAGER" at index [0] is available
in the UserModule context.

Potential solutions:
- Is UserModule a valid NestJS module?
- If "CACHE_MANAGER" is a provider, is it part of the current UserModule?
- If "CACHE_MANAGER" is exported from a separate @Module,
is that module imported within UserModule?

  @Module({
    imports: [ /* the Module containing "CACHE_MANAGER" */ ]
  })

💦What I tried

1) imports 배열 내에 RedisCacheModule 추가 => X
2) providers 내에 아래 코드 추가 => X

   {provide: CACHE_MANAGER}

💡How solve issue

RedisCacheModule 내에 CacheModule를 export 해주면 되었음.

📃What I learned new


  • module은 import 할 수도 있군
  • 팀원이랑 대화하다보면 생각보다 쉽게 오류가 해결되는군

0개의 댓글