44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
exception.getStatus is not a function 에러가 자주 납니다.
안녕하세요. http-exception.filter.ts에서 에러가 자주납니다. 보면 항상 ============================ /Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/dist/main.js:3160 const status = exception.getStatus(); ^ TypeError: exception.getStatus is not a function at HttpExceptionFilter.catch (/Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/dist/main.js:3160:34) at ExceptionsHandler.invokeCustomFilters (/Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/node_modules/@nestjs/core/exceptions/exceptions-handler.js:33:26) at ExceptionsHandler.next (/Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/node_modules/@nestjs/core/exceptions/exceptions-handler.js:13:18) at /Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/node_modules/@nestjs/core/router/router-proxy.js:13:35 at processTicksAndRejections (node:internal/process/task_queues:96:5) ================== 이런 에러가 나고요.. 제가 강의를 단기간에 빨리 듣는게 아니라 오랜기간에 걸쳐 가끔씩 들어서 전에는 뭣때문에 이 에러가 났는지는 기억이 안나는데 그때는 씨드데이터가 없었나? 그래서 워크스페이스를 가져오면 널이니까 데이터를 못찾았다는 에러가 났나 그래서 에러를 던져주는데 그걸 저 필터에서 받아오면 항상 스테이터스를 제대로 못가져오고 백엔드서버가 터집니다. <그때는 씨드데이터를 넣어서 에러가 안나게 만드는 방법으로 해결했습니다. 그 외에 중복회원가입 에러 테스트했을때는 안터지고 getStatus가 잘 동작했습니다.> 타입을 보면 HttpException이라서 항상 getStatus가 가능할것같은데 왜 터지는걸까요? 이번에는 워크스페이스 멤버를 가져오려고 했는데 exception콘솔로그 찍어보면 <아직 워크스페이스 멤버는 한명도 없는 상태,> ============= ForbiddenException: Forbidden resource at canActivateFn (/Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/node_modules/@nestjs/core/router/router-execution-context.js:136:23) at runNextTicks (node:internal/process/task_queues:61:5) at processImmediate (node:internal/timers:437:9) at async /Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/node_modules/@nestjs/core/router/router-execution-context.js:42:31 at async /Users/gzeromin/Desktop/workspace/공부/인프런/zerocho-slack/backend/node_modules/@nestjs/core/router/router-proxy.js:9:17 { response: { statusCode: 403, message: 'Forbidden resource', error: 'Forbidden' }, status: 403 } ========= 이렇게 나와서 이셉션도 맞는것같은데 getStatus함수를 못쓰는것같습니다. 이셉션은 맞는것같고 HttpException도 맞는것같은데 어쩔때는 되고 어쩔때는 안되고 어떻게 해결해야할지 모르겠습니다. 저 이셉션이 무슨 함수를 가지고있는지 어떻게 조사해야할지 모르겠어서 질문남깁니다. 감사합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Exception Filter와 관련하여 질문있습니다.
안녕하세요. 14:00 쯤에 미들웨어에서 발생한 에러는 Exception Filter에서는 catch되지 않는다고 말씀하셔서 확인 해보기 위해 main.ts에서 미들웨어를 만들어서 테스트 해봤는데요. 저는 미들웨어서 throw한 에러도 Exception Filter에서 잡히는 것 같아 질문드립니다. main.ts의 코드는 아래와 같습니다. //main.ts app.use((req, res, next) => { throw new HttpException('미들웨어 에러 테스트', 400); next(); }); //http-exception.filter.ts import { ArgumentsHost, Catch, ExceptionFilter, HttpException, } from '@nestjs/common'; import { Response } from 'express'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse<Response>(); const status = exception.getStatus(); const error = exception.getResponse() as | string | { error: string; statusCode: number; message: string | string[] }; console.log('Exception Filter 동작 확인용'); console.log(error); return response.status(status).json({ code: status, data: typeof error === 'string' ? error : error.message, }); } } '/ '경로로 접속 시 콘솔은 다음과 같았습니다. 위 결과로 보아 미들웨어에서 발생한 에러도 Exception Filter에서도 에러를 잡아주는 것으로 판단 했는데요, 혹시 제가 잘못 테스트한 부분이 있으면 알려주시면 감사하겠습니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
요청 파라미터 관련하여..
안녕하세요 제로초님!! 제로초님 덕분에 테스트해보며 socket과 채팅에 대해 이해했고 이제 실무에서 사용하려고 코드 수정중에 있습니다.제가 궁금한 점은 제로초님 코드에서 요청시 대부분 파라미터에서 값을 가져오는 방식이 많은 데 그렇게 사용하는 이유가 있을까요? 그냥 body나 query로만 주고 받는 거 보다 좋은 점이 있어서 사용하는 것인지 아님 정책적으로 결정하고 가는 것인지 궁금합니다!!
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
무엇이 문제인지 감이 잡히질 않습니다...
안녕하세요 제로초님 강의 잘 보고 있습니다. 강의를 따라하며 테스트를 하는 와중에 잘 되다가 어느 순간부터 갑자기 모든 get 요청이 404가 되었습니다. 다음은 브라우저 콘솔 사진입니다! 계속 반복적으로 get 요청을 보내고 서버를 껐다켜도 그대로인데 어떤 것이 문제인지 잘 모르겠습니다...ㅠㅠ
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
엔티티에서 관계 맺을 때 질문...
@Column('int', { name: 'OwnerId', nullable: true }) OwnerId: number | null; @ManyToOne(() => Users, (users) => users.Workspaces, { onDelete: 'SET NULL', onUpdate: 'CASCADE', }) @JoinColumn([{ name: 'OwnerId', referencedColumnName: 'id' }]) Owner: Users; https://github.com/ZeroCho/sleact/blob/master/nest-typeorm/src/entities/Workspaces.ts 에서 코드 가져왔습니다. name: "ownerId"가 서로 중복되어서 들어가 있는데, 이거를 어떻게 이해할 수 있을까요? --> 컴파일 과정에서 오류가 나지 않는 것이 궁금하다 이것입니다. 최소한 ambigious하다고 오류가 나야할 것만 같은 코드로 보입니다. https://www.inflearn.com/questions/248521 에서 보니 굳이 join을 하지 않고 참조 및 수정을 하기 위한 것으로 보이는데, (실제로 제로초님의 서비스를 보니 join 없이 senderId, ownerId 와 같이 바로바로 수정하는 것을 봤습니다.) joinColumn을 바로 수정하게 되면 join을 하지 않고도 그 안의 정보들이(실제 join되는) 수정 및 참조가 가능한 것인가요? //그런데 질문을 올리고 다시 생각해보니 @joinColumn은 자동으로 ownerId를 만들어 줄텐데, join column에서도 생성되고, 이미 생성을 또 해놓았는데 음... 사실 이 엔티티가 잘 이해가 되지 않습니다. //또 추가로 ManyToOne에서는 적지 않아도 joinColumn을 자동으로 만들어준다고 하면, 위의 코드를 이렇게만 적어도 문제가 안되지 않나 싶기도 합니다... @ManyToOne(() => Users, (users) => users.Workspaces, { onDelete: 'SET NULL', onUpdate: 'CASCADE', }) Owner: Users; //아니면 저렇게 적는 것이 join을 하지 않아도 joinColumn을 유지하기 위한 것인가요? --> 혹시 그렇다면 컴파일 과정에서 오류는 없는지 궁금합니다. 질문이 굉장히 두서없는 점 죄송합니다... 군대에서 연등시간에만 보고 빠르게 적고 하다보니 충분한 이해없이 질문한 거라면 죄송합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
http body에 데이터를 담는경우
강의를 보며 나름의 api를 만들어 보다가 궁금한점이 생겼습니다. 저는 http body가 들어갈 수 있다면, 대부분 body로 프론트에서 백으로 데이터를 보내고, 그렇지 못한 method에만 (get, delete와 같은) query, params를 이용했는데, 제로초님의 깃헙에서 코드도 보고 하니, post요청같은 경우에도 query와 params를 이용하시기도 하고 body를 이용하기도 하던데 본인만의 룰이 있어서 그렇게 하는건가요?? controller들을 잘 찾아보니 보통 생성하는 create에 해당하는 부분만 dto를 생성해서 데이터를 담던데, api를 깔끔하게 사용하기 위한 룰인지 궁금합니다...
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
NestJs, Apollo Federation 관련 질문 입니다.
nestjs를 리용하여 microservice를 만들고 있는데 gateway를 통하여 하위앱들에 접근하고 있습니다. applications- app에서 정의한 스키마 schoolyear.entity.ts를 users-app, students-app등 다른 여러 app 들에서 사용하려고 합니다. //application-app @ObjectType() @Directive( '@key(fields: "school_year_id, date_begin, date_end")', ) @Entity({ name: 'mth_schoolyear' }) export class SchoolYear extends BaseEntity { @Column() @Field(() => ID, { nullable: true }) @PrimaryGeneratedColumn() school_year_id?: number; @Column() @Field(() => Date, { nullable: true }) date_begin: Date; @Column() @Field(() => Date, { nullable: true }) date_end: Date; } //users-app @ObjectType() @Directive('@extends') @Directive( '@key(fields: "school_year_id , date_begin, date_end")', ) @Entity({ name: 'mth_schoolyear' }) export class SchoolYear extends BaseEntity { @Column() @Field(() => ID, { nullable: true }) @PrimaryGeneratedColumn() @Directive('@external') school_year_id?: number; @Column() @Field(() => Date, { nullable: true }) @Directive('@external') date_begin: Date; @Column() @Field(() => Date, { nullable: true }) @Directive('@external') date_end: Date; } //students-app @ObjectType() @Directive('@extends') @Directive( '@key(fields: "school_year_id , date_begin, date_end")', ) @Entity({ name: 'mth_schoolyear' }) export class SchoolYear extends BaseEntity { @Column() @Field(() => ID, { nullable: true }) @PrimaryGeneratedColumn() @Directive('@external') school_year_id?: number; @Column() @Field(() => Date, { nullable: true }) @Directive('@external') date_begin: Date; @Column() @Field(() => Date, { nullable: true }) @Directive('@external') date_end: Date; } 1. @Directive(@key(fields)) 와 @Directive('@external') 사이에 어떤 관계가 있는지? @Directive('@external')가 정의된 모든 field를 @Directive(@key(fields))에 정의해야 합니까? 2. Users-app에서 정의한 external field "date_begin", "date_end"가 stuents-app에도 중복존재하는데 오유가 아닙니까?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
"morgan 모듈 사용하기" 강의에 실제 morgan 사용법이 없어요!
logger 미들웨어 사용하는 방법 잘 봤습니다~ 실서버에서는 morgan을 사용하면 좋다고 하셨는데 강의 제목에는 있는데 실제 내용에는 없어요...ㅠㅠ 혼자 독학해서 할 수야 있겟지만 제로초선생님 강의는 없는건가요 ~~~~~~ plz~
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
ㅁㅇ
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/ㅇㄹwatch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
pm2 질문입니다.
nest에 pm2 사용 중입니다. 로그에 텍스트 색 비활성화 하는 방법 알고 싶습니다. tail 로 볼 때는 좋은데 에디터로 보면 ^[[32 ^[[39 같은 문자들이 섞여 있어 로그 보기가 힘듭니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
NodeJS 진영은 DBCP 기술은 안 쓰나요?
안녕하세요, 현재 강의 수강중 NestJS가 스프링과 너무 닮은 것 같아서 기술을 비교하고 있습니다. 스프링 진영은 대게 DB연결은 DBCP라는 기술을 사용합니다. 보통 DB 연결을 미리 10개 정도 풀에 넣어놓고, 돌려서 쓰죠. 그러면 처음 DB 연결과, 닫기의 부하를 줄일 수 있어서 그런 식으로 쓰는데요. NodeJS도 찾아보니까 DBCP를 구현한 기능이 있긴 한데, TypeORM에 DBCP를 연동하는 방법은 안 보이네요. TypeORM이 내부적으로 DBCP를 해버려서 없는 건지, 아니면 원래 NodeJS 진영은 dbcp를 안 쓰는 건지 궁금합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
프론트 세팅 관련 질문
제로초님 강의 잘 듣고 현업에서 잘 사용하고 있습니다!! 제가 이번에 채팅을 구현하게 될 거 같아서 제로초님이 제공하신 코드에서 프론트 코드만 세팅해서 테스트 해보고 싶은데 어떻게 하는 지 도통 읽어봐도 모르겠어서 글 남깁니다.프론트 코드 세팅하는 방법 알려주시면 감사하겠습니다!!
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
queryRunner질문이요!
안녕하세요! 강의를 보고 공식문서도 봤다가 궁금한게 생겨서 여쭤봅니다! 강의에서 connection으로 하지 않고 예를 들어 this.workspaceMemberRepository로 한것은 처음 typorm에 연결했던 하나의 connection pool로만 연결된다고 하셨는데, 그럼 모든 repository들을 전부 connection 새로 열어서 마지막에 qurryRunner.release() 로 pool을 닫는게 더 좋은건가요...?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
socket onDisconnect 질문
nestjs Gateway 클래스에서 handleDisconnect할때 socket.rooms 하면 텅 비어있는 Set이 나오더라구요. async handleDisconnect(@ConnectedSocket() socket: Socket) { const joinRooms = socket.rooms; const UserId = socket.data.UserId; console.log('socket disconnected'); console.log(UserId); console.log(socket.rooms); console.log(socket.connected); for (let room of joinRooms) { if (!room.includes('room')) continue; const RoomId = room.split(':')[1]; this.redis.srem(`inRoom:${RoomId}:users`, UserId); } this.redis.srem('online:users', UserId); } 위처럼 연결이 끊어질시에 레디스 상태를 수정하려고하는데, socket.rooms가 텅 비어져있습니다. 저기서 connect할때 넣어준 socket.data.UserId는 살아있는데 말이죠.원래 이렇게 nestjs단에서 끊어버리는건지 궁금합니다. 그렇다면 따로 disconnect이벤트를 만들어서 emit해줘야하는걸까요?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
config 질문드립니다.
운영 배포를 위하여, 개발, 운영 간의 환경 설정 파일을 달리 하고자 합니다. 강의 진행해주신 .env, .env.developer, env.production 세개로 나누어서 파일을 생성해 두었으며, app.module.ts에 아래와 같이 임포트를 하였습니다. 허나, process.env.XXXX 를 활용하고자 하면 무조건 적으로 .env 파일을 바라보게 되고 있습니다. 설정을 빠뜨린게 있을까 싶어 한번 더 확인해 보았지만 도저히 모르겠습니다. 도움 부탁드립니다. @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV === 'production' ? '.env.production' : process.env.NODE_ENV === 'develpment' ? '.env.develpment' : '.env', ignoreEnvFile: process.env.NODE_ENV === 'production', }), PeriodModule, ScheduleModule, RssReaderModule, AuthModule, TypeOrmModule.forRoot(ormconfig), ], controllers: [AppController], providers: [AppService], }) export class AppModule {} #pakage.json "start:debug": "cross-env NODE_ENV=development nest start --debug --watch", "start:prod": "cross-env NODE_ENV=production node dist/src/main",
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
express를 WAS역할이라고 생각해도 될까요?
안녕하세요? Spring에서 NestJS로 전향하기 위해서 강의를 열심히 듣고 있습니다. nodejs나 nestjs를 공부하면서 express가 WAS인가 하는 궁금증이 들었습니다. Node.js는 Javascript의 런타임 이고, express라는 웹 프로엠워크 이용하여 Web Application 구동해준다 라고 생각을 합니다만 express를 was라고 생각해도 맞는 걸까요 ?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
dotEnv 가져올때
dotEnv 가져올때 예시로 await axios.get('/비밀키요청') 등 외부에서 가져올경우가 있다고 하셨는데 혹시 외부에서 가져오는 이유가 별도로 있을까요? 환경변수 설정을 배포할서버에 두는게아니라 외부에 둠으로써 얻는게 무엇이 있나요? 혹시 이와관련해서 어떻게 검색해서 자료를 봐야할지 추천해주시면 감사하겠습니다!
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
session로그인
jwt를 이용한 방식의 로그인 말고 혹시 session방식의 로그인은 강의 계획 없으실까요?? ㅠ
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Typeorm Module 설정 문의
안녕하세요. 제로초님. 강의를 듣다가 이해가 되지 않는 부분이 있어서 그렇습니다. 저희 회사에서는 nestjs로 코딩을 하고 있어 기초가 많이 부족한 상태에서 nestJS로 공부를 하는 중입니다. 질문드릴 부분은 강좌 내에 TypeORM 사용하기 / 회원가입 만들기 / 14:50에 App.module.ts에 Users 엔티티가 imports 되지 않아서 생긴 문제인것 같고 실제로 제로초님께서 TypeOrmModule.forFeature([Users]) 를 넣어 주시니 실행이 되더군요. 저는 여기서 생기는 의아한점이 강좌내에 ormConfig를 만들고 forFeature 바로 윗줄에 forRoot(ormConfig) 안에 entities 값에 정의 해 놓은 entity 파일들을 import해준것 같은데 왜 인식이 되지 않고 forFeature를 만들어 주어야 하나요?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
공식문서 리뷰 중 npx @nestjs/cli 이슈
안녕하세요 제로초님! nest 공식 문서를 따라하고 있는데요, (1) https://dj-min43.medium.com/nestjs-%EC%84%A4%EC%B9%98%EC%97%90%EB%9F%AC-335d479ee3a0 제 PC 환경에서 npm 은 먹지 않고 위 글대로 npx @nestjs/cli 로 해야 정상적으로 프로젝트 생성이 되는 것 같습니다. 혹시 원인을 알 수 있을까요? 피씨 환경은 Apple M1 Pro 입니다. (2) npx 를 이용해서 설치한 후에 npm run stat 명령어를 수행하면, 아래 상태까지만 진행이 되고 종료가 됩니다. 혹시 의심가는 부분이 있을지 한번 검토 부탁드립니다!