46,200원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
PositiveIntPipe 생성할때 @Injectable() 사용한 이유
안녕하세요! 강의 잘듣고있습니다.!! PositiveIntPipe pipe를 만들때도 의존성 주입을 해야하기 때문에 @Injectable()를 사용하신건가요?? 만약 맞다면 사용한 이유가 궁금합니다.!!( @Injectable 를빼도 작동이 잘되고 파이프도 의존성을 주입해야하나? 라는 궁금증이 있어서 남깁니다!) 감사합니다!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
멀터를 사용하는데 파일은 저장되지만 @uploadedFile()에서 파일을 불러올 수가 없습니다.
안녕하세요 윤상석님. 윤상석님께서 멀터 강의를 하실 때 사용하신 코드를 제가 잘 재구성해서 사용하고 있습니다. // multer.config.ts import { Logger } from "@nestjs/common"; import { MulterOptions } from "@nestjs/platform-express/multer/interfaces/multer-options.interface"; import * as fs from "fs"; import * as path from "path"; import * as multer from "multer"; export class MulterConfig { static createFolder(folder1: string, folder2: string) { const logger = new Logger("Multer"); try { logger.log("create uploads folder"); fs.mkdirSync(path.join(__dirname, "../../../uploads")); } catch (err) { logger.log("uploads folder is already exist"); } try { logger.log(`create ${folder1}folder into uploads foler`); fs.mkdirSync(path.join(__dirname, `../../../uploads/${folder1}`)); } catch (err) { logger.log(`${folder1} is already exist`); } try { logger.log(`create ${folder2}folder into uploads folder`); fs.mkdirSync(path.join(__dirname, `../../../uploads/${folder2}`)); } catch (err) { logger.log(`${folder2} is already exist`); } } static storage(folder: string): multer.StorageEngine { return multer.diskStorage({ destination(req, file, cb) { const folderName = path.join(__dirname, `../../../uploads/${folder}`); cb(null, folderName); }, filename(req, file, cb) { const ext: string = path.extname(file.originalname); const fileName = `${path.basename( file.originalname, ext, )}-${Date.now()}${ext}`; cb(null, fileName); }, }); } static apply(folder: string) { const result: MulterOptions = { storage: this.storage(folder), }; return result; } } 그리고 이미지 등을 업로드를 할때 다음과 같은 코드를 사용합니다. // upload.controller.ts import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, UseInterceptors, UploadedFile, Res, } from "@nestjs/common"; import { UploadService } from "../../upload/services/upload.service"; import { ImageReturnDto } from "../../upload/dto/image-return.dto"; import { IsLoginGuard } from "src/common/guards/isLogin.guard"; import { MulterConfig } from "src/common/config/multer.config"; import { FileInterceptor } from "@nestjs/platform-express"; import { GetDecodedJwt } from "src/common/decorators/get-decoded-jwt.decorator"; import { JwtPayload } from "src/common/interfaces/jwt-payload.interface"; import { JSON } from "../../../common/interfaces/json-success.interface"; import { Response } from "express"; import { CookieOption } from "src/common/config/etc"; import { ProductImageCookieKey } from "./../../../common/config/etc"; import { IsAdmin } from "src/common/decorators/isAdmin.decorator"; @Controller("upload") export class UploadController { constructor(private readonly uploadService: UploadService) { MulterConfig.createFolder("image", "video"); } @UseGuards(IsLoginGuard) @UseInterceptors(FileInterceptor("image", MulterConfig.apply("image"))) @Post("/image-for-product") async uploadImgForProduct( @IsAdmin() @UploadedFile() file: Express.Multer.File, @GetDecodedJwt() jwtPayload: JwtPayload, @Res() res: Response, ): Promise<JSON<ImageReturnDto>> { console.log("logging image info ->\n", file); const result = await this.uploadService.uploadImgForProduct( file, jwtPayload, ); res.cookie(ProductImageCookieKey, result.url, CookieOption); return { statusCode: 201, message: "사진을 업로드 하였습니다.", result, }; } } 상품 사진을 업로드 하기 위해서 만든 코드인데 상품에 사진 하나만 사용하기 위해 FilesInterceptor대신 FileInterceptor를 사용했습니다. 그리고 폴더를 만드는 메서드는 분리해서 따로 사용합니다. 포스트맨 등으로 해당 api에 사진을 formData에 담고 이미지를 아래 처럼 키값으로 담았습니다. 해당 이미지는 그림으로 배우는 SQL 입문이라는 책의 표지입니다. 요청을 보내면 아래에 storage 메서드에 콜백 함수안에 제가 브레이크 포인트를 걸어두어 저쪽에 도달합니다. storage 메서드를 실행하고 이제 컨트롤러에 도달하면 uploads/image 디렉터리에 사진이 저장됩니다. 이미지를 열어보면 정상적으로 불러와집니다. 근데 문제가 @UploadedFile()데코레이터를 file에 붙여 주었고 타입을 Express.Multer.File로 붙여 주었는데도 file을 콘솔로찍으면 undefined가 나옵니다. 어디가 문제인지 알 수 있을까요? 그리고 번외로 상품을 만든다고 가정할 때 body에 form 데이터와 raw/json값을 동시에 담지 못해서 저는 먼저 이미지를 업로드 하고 이미지의 url을 쿠키로 보내어서 상품 정보를 만드는 컨트롤러에서 쿠키에 있는 url과 상품 정보를 같이 데이터베이스로 보내서 상품 하나를 만듭니다. 혹시 이런방법이 실무등에서 쓰이게 되나요? 아니면 더 좋은 방법이 있을까요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
mysql 접속이 안되요
안녕하세요 강사님 mysql 접속이 안되요 이거 왜 그런지 아시나요?
- 해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
dist가 아닌 전체 파일을 올릴 경우 질문드립니다!
안녕하세요 선생님. 강의 덕분에 현재 프로젝트를 잘 진행하고 있습니다! 그런데 PM2 사용 중 궁금한 점이 있어서 질문을 드립니다. 강의에서는 이미 빌드한 dist폴더만 올리는 것으로 되어있는데 src폴더를 올린 후에 운영중인 서버에서 build를 하게 되었을 때 prebuild로 인해서 dist/main.js를 찾을 수 없어 오류가 발생하게 되고 있습니다.. 이미 운영중인 서버에서 빌드 하기 전 파일을 올리고 서버 중단 없이 변경사항을 적용할 수 있는 방법이 있을지 궁금합니다.!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
mongodb 연결 불가 문제
안녕하세요. .env에 MONGODB_URI를 못 읽어서 계속 mongodb connect 실패가 발생하고 있습니다. 혹시나 하여 app.modules.ts 에서 @Modules 앞 뒤로 MONGODB_URI를 콘솔로 찍어봤는데 @Modules 전에는 값이 안나오고 이후에는 잘 출력되는데요. 혹시 추가로 확인해야할 부분이 있을까요? 감사합니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Unsupport Engine... error
처음 깃허브에서 소스를 받고 npm i를 하게되면 아래 이미지와 같은 내용이 발생합니다. 영상은 괜찮은데..말이지요.. 어떻게 해야 할까요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
소수점 입력시 Validation faile 발생 되니다.
소수점 입력시 Validation faile 발생 되니다. cats.controller.ts prositiveInt.pipes.ts main.ts
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
로그 출력 부분
로그 출력 되는 부분에서 선생님과 다르게 출력이 되어서 문의 드립니다. [] 안에 originalUrl이 출력되는 샘과는 달리 저는 [HTTP]로 출력이되고 따로 originalUrl이 출력이 되고 있습니다.. 혹시 제가 어떤 부분에 잘못된것인지 모르겟어서 문의 드립니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
common entity 상속 시 컬럼 순서 문제
안녕하세요 typeorm 강의에서 쓰신 common entity를 상속하는 코드를 사용하면 위와 같이 컬럼 순서가 나오는데 이렇게 되면 가독성이 안좋아서 컬럼 순서를 바꿔보려 했습니다. 검색해보니 엔티티를 상속했을때 컬럼 순서를 바꿀수 없다고 합니다. https://www.mrlatte.net/code/2020/11/03/typeorm-entity-inheritance.html 실무에서는 어떻게 사용하시는지 궁금합니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
cli 원하는 버전
터미널에서 nest new <name>으로 새로운 네스트 프로젝트를 생성할 수가 있는데 여기서 최신버전이 아닌 원하는 버전으로 세팅이 되게끔 하는 명령어가 있는지 알고싶습니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
미들웨어 생산하면 cats폴더에 생성이 안되는데요.
안녕하세요. 제가 nest g middleware logger를 하니깐 제일 상위 폴더에 생기는데 강의를 보면 cats폴더 안에 파일이 생기는데요. 그냥 사용하면 되는건가요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
npm run start:dev port 에러요...
안녕하세요 저 실행을 npm run start:dev를 사용하면 코드를 하나만 바꿔도 조금있다가 서버가 다운되고나서 [Nest] 60168 - 2022. 05. 26. 오후 6:21:17 ERROR [NestApplication] Error: listen EADDRINUSE: address already in use :::8000 +2ms Error: listen EADDRINUSE: address already in use :::8000 이렇게 떠서 포트를 죽이고 또 죽이는데 계속 이렇게 해야되나해서요ㅠㅠ 그 웹팩설정하면 괜찮아진다고 하던데 무슨 방법이있을까요??
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
cron을 설정했는데 useGuard가 작동을 하지 않습니다.
안녕하세요! 강사님 알려주신 내용 기반으로 개인 프로젝트 작업을 하다가 구글링으로 찾기 힘들어서 질문을 남깁니다. cron으로 특정 유저의 정보를 read하는 API를 자동으로 call하려고 합니다. 이렇게 설정을 하고 나면 Guard에서 얻게되는 user 정보를 가져오지 못해서 다음과 같은 에러가 나오게 됩니다. 대략적으로 구글링을 해본 결과 cron은 singletone일 때만 작동하는 것으로 되어있는데 다른 API에서 얻는 값은 매 요청마다 새로 설정되는 Request scope라서 그렇다고 하는데 정확히 내용이 이해가 가지 않습니다. 공식문서에 나온대로 JwtAuthGurad에 @Injectable({scope: scope.Default})로 지정도 해보았는데 결과는 에러가 나왔습니다. 혹시 useGuard에서 나온 결과를 포함해서 API call을 크론잡하려고 하면 어떻게 해야할까요? 매번 답변 주셔서 감사드립니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
nestjs에서 express의 Reqest객체를 사용할 때 req를 이용해서 미들웨어끼리 값을 공유할수 있는지 궁금합니다.
제가 express를 몇번 사용해보고 상석님 강의를 보게 되었는데 제가 진행하던 프로젝트에서 첫 번째 미들웨어에서 req에 값을 넣은 후 두 번째 미들웨어에서 그값을 다시 사용하였던적이 있었는데 nestjs에서는 그 방법이 효용될까요? 예를 들어 data라는 이름의 req 프로퍼티를 만들면 data라는 이름은 정의되어있지 않다고 해서요. req.data 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>' 형식에 'data' 속성이 없습니다.ts(2339)
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
어디에서 에러가 났는지 이유를 찾을 수 없습니다...ㅠㅠ
C:\Users\kal65\OneDrive\바탕 화면\Programming\nestjs-start\cat\src\main.ts:21 app.useStaticAssets(path.join(__dirname, './common', 'uploads'), { ^ TypeError: Cannot read properties of undefined (reading 'join') at bootstrap (C:\Users\kal65\OneDrive\바탕 화면\Programming\nestjs-start\cat\src\main.ts:21:28) at processTicksAndRejections (node:internal/process/task_queues:96:5) useStaticAssets 함수 사용 후 이렇게 뜨는데 경로가 잘못된거라고 판단되어 이거저거 변경해봐도 제대로 적용되지 않습니다..ㅠㅠ 도움 부탁드립니다... 혹시 몰라서 깃허브 링크 남겨드리니 확인 부탁드립니다!! https://github.com/Robinkim93/nestjs-cat
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
class-transform 데코레이터들 끼리의 실행순서가 궁금합니다.
nest의 실행 흐름을 살펴보면 request -> class-transform -> class-validator 순으로 흘러가는데 dto를 검증하는 class-transform 데코레이터 끼리는 어떻게 순서를 판별하는지 궁금합니다. @Type(() => ) @Transform(() => ) 두 가지의 데코레이터는 항상 익명함수가 실행될 때 @Type이 먼저 실행되는데 그 이유가 궁금합니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
순환참조가 되면 안되는 이유가 궁금합니다.
순환참조라는 것을 방지하기 위해서 forwardRef메서드를 사용해서 순환참조에러를 방지한다고 말씀해주셨는데, 순환참조가 되면 안되는 이유와 어쨌든 양방향에서 imports를 하는데 forwardRef메서드를 사용하면 어떤 원리로 순환참조에러를 해결할 수 있는지 궁금합니다!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
DI 할 때 질문
CatsController에 생성자 함수에 CatsService를 주입 할 때 readonly키워드를 사용하신 이유를 알 수있을까요?? 제가 보기에는 해서 나쁠건 없겠지만 타당성을 잘 모르겠어서 질문 남깁니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
본 예시에서는 클라이언트에서 JWT를 어디에 저장했나요?
Express로 코딩을 하다 Nest를 써보고 싶어서 해당 강의를 수강중입니다. Express를 사용할 때는 JWT를 Cookie에 저장하여 매 요청때마다 인증하는 방식을 사용했었는데요. 본 예제에서는 JWT를 HTTP Header의 Authorization에 표함시켜 요청을 보내는 것 같은데, 그럼 JWT를 어디에 저장했는지 궁금합니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
멀티이미지는 s3로 어떤식으로 구현하면 될까요?
aws서비스쪽에서 for문으로 돌리면 될까요? 잘모르겠습니다.