20240201

귤금·2024년 2월 1일

Node.js 4기 TIL

목록 보기
27/86

Today?

Node.js 숙련주차 2주차


개인과제

이력서 업데이트

patch를 사용하여 이력서 항목을 업데이트 하는 로직을 구현했는데, 테스트 중 문제를 하나 알게 되었다...

const updatedResume = await prisma.resumes.update({
            where: { resumeId: +resumeId },
            data: {
                title:title,
                contents:contents,
                statusCode:statusCode,
            },
        });

사실 이렇게 기존 코드로 업데이트를 진행해도 무방하나 데이터를 보내지 않을 경우 해당 데이터도 공란으로 엎어쳐지는 문제가 있었다. 사실 업데이트 때보다 신규 등록시에 더 문제가 되는 부분이었다.
statusCode라는 컬럼의 기본값이 "APPLY"인데, 이력서 등록 시 다른 값이 들어갈 가능성을 고려해서(관리자용 옵션) 등록하는 라우터에 해당 항목을 받아와 넣어주는 로직을 구현했었다. 그런데 아무 값도 보내지 않으면 공란으로 저장되고 기본값 적용이 안 되길래 부득이하게 statusCode는 등록 라우터에서 제외했었는데...

const resume = await prisma.resumes.create({
		data: {
			userId,
			title,
			contents,
            ...(statusCode && { statusCode }),
		},
	});

이런 식으로 수정하니까 해결되었다.

  1. statusCode 값이 존재하면 (statusCode가 undefined, null 또는 빈 문자열이 아니면), { statusCode } 객체를 생성한다.
  2. 객체 확장 표현식(...)을 사용하여 이 객체를 data 객체에 병합함!
  3. 결과적으로 statusCode가 존재하면 data 객체에 statusCode 속성이 포함된다.

구조분해할당과 전개연산자를 이런 식으로 활용할 수 있구나...

자동 로그인 구현

로그인 검증용 미들웨어를 조금 수정하여 자동 로그인을 구현했다.
검증이 필요한 요청을 보낼 때마다 해당 미들웨어를 거치는데, 여기에서 토큰을 검증하고 액세스 토큰이 만료가 되어있으면 리프래시 토큰이 살아있는지 체크한다...

if (error.name === 'TokenExpiredError' && refreshToken) {
			try {
				const decodedRefreshToken = jwt.verify(
					refreshToken,
					process.env.REFRESH_TOKEN_SECRET_KEY,
				);
				const newAccessToken = createAccessToken(decodedRefreshToken.id);

				res.cookie('accessToken', newAccessToken, { httpOnly: true });

				req.user = await prisma.users.findFirst({
					where: { userId: decodedRefreshToken.id },
				});
				return next();
			} catch (refreshTokenError) {
				// 리프레시 토큰 오류 처리
				res.clearCookie('accessToken');
				res.clearCookie('refreshToken');
				return res.status(401).json({ message: '재로그인이 필요합니다.' });
			}
} else {
	switch (error.name) {
		case 'JsonWebTokenError':
			return res.status(401).json({ message: '토큰이 조작되었습니다.' });
		default:
			return res
				.status(401)
				.json({ message: error.message ?? '비정상적인 요청입니다.' });
	}
}

TokenExpiredError < 가 토큰이 만료되었을 때 발생하는 에러명이다. 이렇게 해서 리프래시 토큰이 만료되기 전까진 자동 로그인을 유지할 수 있따..

Swagger

끔찍함...전부 내가 써서 돌려야 하는 라이브러리인줄은 몰랐다
주석형태로 스키마와 예시, 라우터 주소 등을 지정해서 불러와줌...
https://editor.swagger.io/
참조하고, 오류가 나는 부분들은 chatGPT의 도움을 받았다. 줄맞춤이 다르거나 구성이 다르거나 하면 짤없이 안 먹혀서 너무 힘들었다.

카카오 로그인 연동

https://developers.kakao.com/
여기서 개발자 등록부터 하고... 살펴봤다.

yarn add passport passport-kakao -S

오늘 배운 것

회고

swagger의 끔찍함...

0개의 댓글