묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
@IsPublic 어노테이션으로 RefreshTokenGuard에서 RefreshToken 검증을 하기 위한 코드 공유
// is-public.const.ts export enum IsPublicEnum { ISPUBLIC = 'ISPUBLIC', ISREFRESHTOKEN = 'ISREFRESHTOKEN', }// is-public.decorator.ts import { SetMetadata } from '@nestjs/common'; import { IsPublicEnum } from '../const/is-public.const'; export const ISPUBLIC_KEY = 'is_public'; export const IsPublic = (status: IsPublicEnum) => SetMetadata(ISPUBLIC_KEY, status);// bearer-token.guard.ts @Injectable() export class BearerTokenGuard implements CanActivate { constructor( private readonly authService: AuthService, private readonly usersService: UsersService, public readonly reflector: Reflector, ) {} async canActivate(context: ExecutionContext): Promise<boolean> { const req = context.switchToHttp().getRequest(); const requiredPublic = this.reflector.getAllAndOverride(ISPUBLIC_KEY, [ context.getHandler(), context.getClass, ]); if (requiredPublic) { req.requiredPublic = requiredPublic; } if (requiredPublic === IsPublicEnum.ISPUBLIC) { return true; } const rawToken = req.headers['authorization']; if (!rawToken) throw new UnauthorizedException('토큰이 없습니다!'); const token = this.authService.extractTokenFromHeader(rawToken, true); const result = await this.authService.verifyToken(token); const user = await this.usersService.getUserByEmail(result.email); req.user = user; req.token = token; req.tokenType = result.type; return true; } }추가된 코드if (requiredPublic) { req.requiredPublic = requiredPublic; }requiredPublic 있을때만 req에 담아줌.추가된 코드if (requiredPublic === IsPublicEnum.ISPUBLIC) { return true; }IsPublic일때만 return true 즉, ISREFRESHTOKEN 일때는 아래 로직들이 정상적으로 실행됨.// bearer-token.guard.ts @Injectable() export class AccessTokenGuard extends BearerTokenGuard { async canActivate(context: ExecutionContext): Promise<boolean> { await super.canActivate(context); const req = context.switchToHttp().getRequest(); if ( req.requiredPublic === IsPublicEnum.ISPUBLIC || IsPublicEnum.ISREFRESHTOKEN ) { return true; } if (req.tokenType !== 'access') { throw new UnauthorizedException('Access Token이 아닙니다.'); } return true; } }추가된 코드if (req.requiredPublic === IsPublicEnum.ISPUBLIC || IsPublicEnum.ISREFRESHTOKEN) { return true; }req.requiredPublic이 ISPUBLIC이거나 ISREFRESHTOKEN이면 return true로 global accessTokenGuard return true로 빠져나옴.// bearer-token-guard.ts @Injectable() export class RefreshTokenGuard extends BearerTokenGuard { async canActivate(context: ExecutionContext): Promise<boolean> { await super.canActivate(context); const req = context.switchToHttp().getRequest(); if (req.tokenType !== 'refresh') { throw new UnauthorizedException('Refresh Token이 아닙니다.'); } return true; } }변경 사항 없음. 왜냐하면 위에서 정상적으로 refreshToken을 verify하고 req에 값이 담겼기 때문에 RefreshTokenGuard가 정상적으로 실행 되어야함. auth.controller에 적용하기@Controller('auth') export class AuthController { constructor(private readonly authService: AuthService) {} @IsPublic(IsPublicEnum.ISREFRESHTOKEN) @Post('token/access') @UseGuards(RefreshTokenGuard) postTokenAccess(@Headers('authorization') rawToken: string) { ... } @IsPublic(IsPublicEnum.ISREFRESHTOKEN) @Post('token/refresh') @UseGuards(RefreshTokenGuard) postTokenRefresh(@Headers('authorization') rawToken: string) { ... } @IsPublic(IsPublicEnum.ISPUBLIC) @Post('login/email') @UseGuards(BasicTokenGuard) postLoginEmail(@Headers('authorization') rawToken: string) { ... } @IsPublic(IsPublicEnum.ISPUBLIC) @Post('register/email') postRegisterEmail(@Body() body: RegisterUserDto) { ... } }
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
별거 아니긴 한데 nest-cli 로 만들때
nest cli로 resource 만들때 경로를 / 넣어주면 아래에 바로 생성 됩니다.nest g resource posts/comments이렇게 하면 posts폴더 아래에 comments가 생깁니다!
-
미해결따라하며 배우는 NestJS
pgAdmin 4에서 데이터 베이스 만들어주기 부분
안녕하세요5. Postgres & TypeORM 정리하기이부분에서PostgresSQL, pgAdmin을 설치하고 데이터 베이스를 만들어주는 과정에서서버를 우선 만들고,BoardProject 하위 목록에Databases 에서 create -> Database에 들어가서 database 를 만들어주려고 하는데강의에서는 input 목록이Database, Owner, Comment 이 세가지만 있는데OID 라는것이 추가되어 있어요... 여기다가 어떤걸 적어줘야 하는지 모르겠고,비운 상태로 save 를 누르면이런 에러가 뜹니다.new locale provider (libc) does not match locale provider of the template database (icu) HINT: Use the same locale provider as in the template database, or use template0 as template.어떻게 해줘야할까요? ㅠㅠpgAdmin 4 를 다운받아서 이런 문제가 발생하는걸까요? 데이터베이스 자체를 만들지 못했으니 뒤로 넘어가지 못하고 계속 헤매는 중입니다 ㅠ 자세한 답변 부탁드리겠습니다.!!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
가드와 미들웨어 질문드립니다.
안녕하세요.,강의 잘 보고있습니다. 가드랑 미들웨어 용도를 이렇게 이해하면 좋을까요? 1.가드:-특정 컨트롤러로 들어온 파라매터, 혹은 context데이터를 가공하거나 검증하고 싶을때 2.미들웨어:-특정 규칙을 가진 패쓰 혹은 컨트롤러 전체에 데이터를 검증하고 싶을때 아주 맨 처음에 저는 token 을 검증하는 BearerTokenGuard이 가드보다는 middleware 로 가는것이 맞지 않나 싶었는데요.context.user 데이터를 controller 에 내려주기 위해IsCommentMine Guard 처럼 다른 가드로 유저데이터를 넘겨줘야하는 경우가 있어서가드로 사용하는것으로 이해했는데 맞을까요?(그리고 middleware 로는 불가능한걸까요?)
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
update comment 관련
안녕하세요.update comment 관련 두가지 질문이 있습니다.update(patch) 에서는 query runner를사용하지 않아도 되나요?update 시에repository.update 가 아닌 save 를 사용한 이유가 있을까요?항상 강의 잘 보고있습니다.감사합니다!
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
ValidationPipe DTO 변환 대신 JS Object 로 변환되는 이유
DTO 변환이 잘 되다가 다른 테스트 케이스 작성중에 아래 처럼 SignInUserRequest DTO 로 변환이 안되는 경우를 겪었습니다. ValidationPipe 옵션 transform: true 임에도 불구하고, 이런 현상이 일어나는 이유를 알 수 있을까요?아래는 잘되는 경우입니다.읽어주셔서 감사합니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
ValidationPipe DTO 변환 대신 JS Object 로 변환되는 이유
DTO 변환이 잘 되다가 다른 테스트 케이스 작성중에 아래 처럼 SignInUserRequest DTO 로 변환이 안되는 경우를 겪었습니다. ValidationPipe 옵션 transform: true 임에도 불구하고, 이런 현상이 일어나는 이유를 알 수 있을까요?아래는 잘되는 경우입니다.읽어주셔서 감사합니다.
-
해결됨[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
docker-compose up 후에 터미널엔 연결 됐다고 떴는데 postgres-data 폴더에 아무것도 들어와 있지 않아요
다 맞게 잘 한 거 같은데 뭐가 문제인 지 모르겠습니다ㅜㅜ
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
섹션5의 Post 요청 만들기에서 질문있습니다.
안녕하세요.섹션5의 Post 요청 만들기 영상을 보다가 궁금증이 생겨 질문드립니다. Q1)새로운 post 생성시 id를 부여할 때배열의 마지막 인덱스 아이템을 꺼내해당 아이템의 id에 1을 더하셨습니다.그런데 배열 안의 아이템 순서가 꼭 id-오름차순으로 정렬되어있을거란 보장이 없기 때문에배열에서 가장 큰 id를 찾은 후, +1을 하여 새로운 id를 부여해줘야하지 않을까 싶은데 제가 잘못 생각하고 있는걸까요? Q2)새로운 post를 기존 배열에 push하지 않고,spread 방식으로 추가해주셨는데특별한 이유가 있는건지도 궁금합니다!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
Transform이 적용이 안됩니다.
Transform을 적용해도 path값에 public/posts값이 붙지 않은 채로 계속 나옵니다.main.ts파일에 위와 같이 적용을 해도 안되는데 혹시 원인을 알 수 있나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
배포하기 챕터에서 도커컴포즈 빌드->업 후 로그 확인하면 sh: 1: nest: not found 오류
안녕하세요! 강사님 강의 잘 듣고 있습니다. 섹션 19. 17-01 강의를 따라하고 있는데 쉘에 깃클론 -> 환경변수 파일 만들고 -> 도커 컴포즈 빌드 -> 도커 컴포즈 업 이렇게 명령어를 따라갔는데 로그가 너무 오래 찍히더라구요! 무슨일인가 싶어 일단 취소하고 docker ps -a 명령어로 확인해봤더니 서버가 만들어지고 꺼진 것 같더라구요 해당 image 아이디를 가지고 docker logs 를 봤는데 위와 같은 메세지가 나옵니다. 검색해봤더니 nest/cli를 devDependencies 에서 빼고 dependencies 에 넣으라고 해서 그렇게 했는데도 오류는 동일하게 나오네요 ㅠㅠ 혹시 몰라 도커파일에 RUN npm install @nestjs/cli 를 추가해봤는데 이번에는 swagger pluginrs 가 설치되지 않았다는 오류가 나옵니다. 어떻게 하면 좋을까요??
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Exception 포스트맨으로 확인 시 undefined 에러
에러[Nest] 48206 - 01/24/2024, 4:13:26 PM ERROR [ExceptionsHandler] You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable. at Object.createInvalidObservableTypeError (/Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/util/throwUnobservableError.js:5:12) at Object.innerFrom (/Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/observable/innerFrom.js:93:36) at doInnerSub (/Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/operators/mergeInternals.js:22:21) at outerNext (/Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/operators/mergeInternals.js:17:70) at OperatorSubscriber._this._next (/Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/operators/OperatorSubscriber.js:33:21) at Subscriber.next (/Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/Subscriber.js:51:18) at /Users/kwonyeji/Documents/nestStudy/a-nest/node_modules/rxjs/dist/cjs/internal/observable/innerFrom.js:120:28 at process.processTicksAndRejections (node:internal/process/task_queues:95:5)2.의심 코드<main.ts>import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { HttpExceptionFilter } from './httpException.filter'; declare const module: any; async function bootstrap() { const app = await NestFactory.create(AppModule); const port = process.env.PORT || 3000; app.useGlobalFilters(new HttpExceptionFilter()); const config = new DocumentBuilder() .setTitle('Sleact API') .setDescription('Sleact 개발을 위한 API 문서입니다.') .setVersion('1.0') .addTag('connect.sid') .build(); const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('api', app, document); await app.listen(port); console.log(`listening on port ${port}`) if (module.hot) { module.hot.accept(); module.hot.dispose(() => app.close()); } } bootstrap(); 에러상황회원가입 구현 후 에러 확인 하려고 포스트맨 으로 요청 시 200성공이 떨어지는게 아니라 해당 에러가 발생합니다. 값을 모두 넣어도 같은 에러가 발생하고 console 찍었을떄 아예 controller에 접근하지도 못했습니다. 설정이 잘못된 건지 잘 모르겠습니다 ㅠ
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
class interface 질문
안녕하세요 제로초님 다른 비슷한 질문에서 다음과 같은 답변을 하셨어요 런타임에 있어서 런타임에도 타입체크를 수행하길 원하면 class로 선언하면 되고, 런타임에는 없길 원하면 interface를 쓰시면 됩니다. 런타임이 실제 코드가 실행될때라고 이해하고 있는데 런타임에 타입체크등 코드가 남아있으면 좋은점이 와닿지 않아서요!실제로 어떤 경우에 런타임에 코드가 남아있서서 좋은지, 타입체크가 되면 좋은지 여쭤봐도 될까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
데코레이터가 잘 이해가 안갑니다.
@Field 하면 어떠한 객체에 있는것에 있는 Field 를 가져다 쓸거야~ 라고 말하면서 그러한 함수를 불러오는 건가요?? ㄷ
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
웹에서 포스트 맨 사용하면 파일업로드가 불가능합니다.
아무리 찾아봐도 웹에서 해결하는 것이 불가능해서 postman desktop 까는 것을 추천드립니다 ㅎㅎ
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
gateway level에서 filter도 잘 작동합니다!
@UsePipes( new ValidationPipe({ transform: true, transformOptions: { enableImplicitConversion: true, }, whitelist: true, forbidNonWhitelisted: true, }), ) @UseFilters(SocketCatchHttpExceptionFilter) @WebSocketGateway({ // ws://localhost:3000/chats namespace: 'chats', }) export class ChatsGateway implements OnGatewayConnection { constructor( private readonly chatsService: ChatsService, private readonly messagesService: ChatsMessagesService, ) {} ... }각각의 메소드마다 넣어주는것보다 나은것 같아서 공유 해보아요!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
ValidationPipe를 좀 더 편하게 쓸 수 없을까해서 찾아보니 controller에서 사용 할 수 있더라고요
https://docs.nestjs.com/faq/request-lifecycle공식 문서에 보니까 controller level에서 사용 할 수 있는것 같아서controller와 gateway가 비슷하니까 사용 가능하지 않을까 해서 테스트 해보니까@UsePipes( new ValidationPipe({ transform: true, transformOptions: { enableImplicitConversion: true, }, whitelist: true, forbidNonWhitelisted: true, }), ) @WebSocketGateway({ // ws://localhost:3000/chats namespace: 'chats', }) export class ChatsGateway implements OnGatewayConnection { ... }해당 gateway에서 usePipes를 설정 할 수 있더라고요!차선책으로 이것도 괜찮은것 같아서 공유 해봅니다!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
19:55초정도에 3명의 사용자중 메세지를 보낼려는 사용자가 "enter_room"에 메세지를 보내는데
아마 강사님 실수인듯합니다.User 1이 enter_room에 2번 채팅방에 참여 한다고 메세지를 보내는데 "enter_chat"이 맞습니다! 제가 실험 해보니까 결국 enter_chat을 제대로 하지 않은 경우에 다른 사용자가 보낸 message를 제대로 리시브 받지 못하더라고요.
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
쿼리러너관련질문
안녕하세요쿼리러너 관련 질문드립니다 코멘트 생성시 Pid 에 일부러 엉뚱한 값을 넣는 경우QueryRunner를 쓰고 안쓰고에 차이가 있더라구요. 예를들어this.commentService.ceateComment(dto, pId, user, qr);qr repository 를 일부러 사용하지 않게 조작하면 pid 에 이상한 값을 넣어도 valitation 없이 create 가 되었는데Qr 을 넘겨주는 순간 아래와 같이 유효하지 않은 pk 에 대해 조작하려고 한다는 validation 을 해주더라구요. { "path": "/posts/{엉뚱한 값}/comments", "statusCode": 500, "message": "insert or update on table \"comment\" violates foreign key constraint \"FK_94a85bb16d24033a2afdd5df060\"", "timestamp": "1/21/2024, 4:06:08 PM"} 이런 차이는 어디서 나는것일지, 이런것들도 Query Runner 의 역할인지도 궁금합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
정규화 엑셀자료
안녕하세요, 09-데이터 정규화 1에서 구글 시트를 사용하시는데 이 주소 어디서 접속 가능할까요?