회원 가입 중 이메일 인증 메일 전송 후 인증을 하지 않은 상태로 API 요청이 time out이 되었을 때 rollback이 되지 않고 DB에 저장이 됨
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순으로 로직 순서 변경💦
📃 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);
}
@UseGuards(AuthGuard('jwt'))를 통과하지 못하는 문제 발생
=> 올바른 guard를 주지 못하니 UserInfo도 읽어오지 못하고 null이 반환
#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
와는 별도로 다른 파일을 만들어 경로를 받고있었음.
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" */ ]
})
1) imports
배열 내에 RedisCacheModule
추가 => X
2) providers
내에 아래 코드 추가 => X
{provide: CACHE_MANAGER}
RedisCacheModule
내에 CacheModule
를 export 해주면 되었음.