inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

passport 관련해서 여쭙니다.

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

프론트쪽에서 워크스페이스 유저 초대를 하면 서버쪽에서는 해당 기능을 요청한 유저가 워크스페이스 오너인지 체크하려고 합니다.. AuthGuard를 확장한 OwnerAuthGuard에서 워크스페이스 레포지터리를 임포트해 db조회해서 요청자가 owner인지 아닌 지 체크하려고 하는 데 passport의 패턴에 어긋나거나 성능상의 문제가 있을까요? 공식문서나 구글링을 해보면 전부 jwt나 아이디, 비밀번호 체크하는 것만 있어서 확실치 않아 질문 드립니다. @Injectable() export class OwnerAuthGuard extends AuthGuard('owner') { async canActivate(context: ExecutionContext): Promise<boolean> { const can = await super.canActivate(context); console.log('LocalAuthGuard can:' + can); if (can) { const request = context.switchToHttp().getRequest(); //여기서 세션에 저장된 id로 workspace테이블을 조회 } return true; } }

  • node.js
  • express
  • nestjs
  • typeorm
tlawofyd1 댓글 1 좋아요 0 조회수 223

테이블 관계

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

안녕하세요 예를 들어 MockUserRepository를 만들고 그 안에 mydb라는 데이터가 있습니다. 만약 기존 User 테이블이 Post 테이블과 관계가 맺어져 있다면 Post까지 mydb에 담아야 하나요? mydb = [{ id= '', name:='', password= '' }] 이렇게 해야 하는 건지 아니면 mydb = [{ id: '', name:'', password: '', post: { id: '', title: ''}] 이렇게 작성해야 하는 건지 궁금합니다!! 그리고 userService에서 postService를 사용하는 로직이 있는데 userService 테스트시 MockPost 테이블까지 같이 구현해야 하는 건지..아니면 다른 방법이 있는 건지ㅜㅜ 궁금하네요 하나만 더 여쭤보자면.. ㅜㅜ 제가 이해가 잘 안가서 그러는데 controller.ts를 테스트할 때는 service를 mock하고, service.ts를 테스트할 때는 데이터베이스를 mock해서 사용하는 건가요??

  • javascript
  • node.js
  • docker
  • rest-api
  • nestjs
댓글 1 좋아요 1 조회수 406

.env 파일 추가 후 빈 화면이 뜹니다.

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

ConfigModule 사용하기(dotenv 진화판) 부분에서 4분 쯤에 .env 추가하셔서 설정하시는 부분에서 막혔습니다. @nestjs/config모듈은 설치된 상태입니다. import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [ConfigModule.forRoot()], controllers: [AppController], providers: [AppService], }) export class AppModule {} app.controller.ts import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello() { return this.appService.getHello(); } } .env SECRET=안녕하세요 packge.json { "name": "a-nest", "version": "0.0.1", "description": "", "author": "", "private": true, "license": "UNLICENSED", "scripts": { "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev-backup": "nest start --watch", "start:dev": "nest build --webpack --webpackPath webpack-hmr.config.js --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.1.1", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, "devDependencies": { "@nestjs/cli": "^10.0.0", "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "dotenv": "^16.3.1", "eslint": "^8.42.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.5.0", "prettier": "^3.0.0", "run-script-webpack-plugin": "^0.2.0", "source-map-support": "^0.5.21", "supertest": "^6.3.3", "ts-jest": "^29.1.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3", "webpack": "^5.89.0", "webpack-node-externals": "^3.0.0" }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } } 코드 작성 후 서버를 재실행 시켰고, 빈 하얀 화면이 출력되는 상태입니다. 제가 놓친 부분이 있을까요?

  • node.js
  • express
  • nestjs
  • typeorm
CB S 댓글 3 좋아요 0 조회수 487

yarn start:dev 실행시 에러

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

포스트맨에서 요청하려는데 어느 부분이 문제여서 에러가 난걸까요? 일단 어느부분을 보셔야 해결해주실 수 있으실지 모르겠어서 캡처를 2개 했습니다.

  • javascript
  • node.js
  • rest-api
  • nestjs
ㅎㅇㄴ 댓글 1 좋아요 0 조회수 783

절대경로 사용시 문제점 질문

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

직접 생성한 모듈 파일을 불러올 때 절대 경로를 사용한다면 node_modules에서 찾기 때문에 유효하지 않다고 했는데, 이게 제스트로 실행할 때만 문제가 되고, 노드로 그냥 실행시킬 때에는 문제가 되지 않는 이유는 뭔가요? 노드로 그냥 실행시킬 때에도 node_modules에서 해당 모듈 파일을 찾아서 에러가 발생해야 하는 것이 아닌가요?

  • node.js
  • express
  • nestjs
  • typeorm
roider2316 댓글 1 좋아요 0 조회수 277

작업형2 모의문제3

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 안녕하세요 선생님, 질문은 3가지 입니다. 1) 저는 문제를 딱 접했을때 분류모형을 써야할지, 예측모형을 써야할지 판가름을 정확하게 못하는 것 같습니다. 쉽게 판별하는 방법이 있을까요? 2) 이 문제의 경우 target인 output 컬럼을 train.head() 로 보면 0과 1로 구분되어있어서, 0 또는 1로 분류하는(분류모형) 것인가 생각했다가도 문제 맨위에서 참조해주는 예시에서 id,output 41,0.633 28,0.123 222,0.355 를 보면 output이 확률값으로 되어있어서 회귀모형을 사용해야하는 것인가? 라고 헷갈리곤합니다. 어디서 개념을 잡지 못하는 것일까요 3) 최종 예측을 할때 pd.DataFrame({'id':test_id, 'output':pred_proba[:,1]}).to_csv("00000.csv", index=False) output에 pred_proba 를 쓰셨는데 참조예시에서 확률값을 OUTPUT에 담았기 때문에 pred_proba를 사용한 것일까요? 그렇다면 output에 pred 를 담는 경우는 어떤 경우인지요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
댓글 1 좋아요 0 조회수 284

유저 컨트롤러 코드 질문

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

깃허브 코드를 보면 @ApiOperation({ summary: '회원가입' }) @UseGuards(NotLoggedInGuard) @Post() async join(@Body() data: JoinRequestDto) { const user = this.usersService.findByEmail(data.email); if (!user) { throw new NotFoundException(); } const result = await this.usersService.join( data.email, data.nickname, data.password, ); if (result) { return 'ok'; } else { throw new ForbiddenException(); } } 이런데 여기서 user가 없는데 왜 NotFoundException()을 날리는 건가요? user가 없으면 그대로 join하여 사용자 등록을 해야 하는 것이 아닌가요?

  • node.js
  • express
  • nestjs
  • typeorm
roider2316 댓글 1 좋아요 0 조회수 202

package.json / "scripts" / schema:drop, schma:sync에 `-d ./dataSource.ts` 옵션을 넣지 않으신 이유가 있으신가요?

해결됨

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

테이블 삭제도 시도해보고 싶어서 터미널에 $ npm run schema:drop 을 입력하였더니 아래와 같은 내용이 나왔습니다. Drops all tables in the database on your default dataSource. To drop table of a concrete connection's database use -c option. 옵션: -h, --help 도움말 표시 [불리언] -d, --dataSource Path to the file where your DataSource instance is defined. [필수] -v, --version 버전 표시 [불리언] 필수 인수가 주어지지 않았습니다: dataSource dataSource가 주어지지 않았다고 해서 살펴보다 package.json/scripts/schema에 다른 명령어들과는 다르게 경로가 지정되어 있지 않는것 같아 아래와 같이 수정했고, { "scripts": { "seed": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed:run -d ./dataSource.ts", "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop -d ./dataSource.ts", "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync", } } 테이블 삭제에 성공했습니다. $ npm run schema:drop > a-nest@0.0.1 schema:drop > ts-node ./node_modules/typeorm/cli.js schema:drop -d ./dataSource.ts query: SELECT VERSION() AS `version` query: SELECT * FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` = '00_nestjs_typeorm' query: START TRANSACTION query: SELECT concat('DROP VIEW IF EXISTS `', table_schema, '`.`', table_name, '`') AS `query` FROM `INFORMATION_SCHEMA`.`VIEWS` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' query: SELECT concat('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`') AS `query` FROM ` `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`channelchats` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`channelmembers` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`channels` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`dms` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`mentions` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`migrations` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`users` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`workspacemembers` query: DROP TABLE IF EXISTS `00_nestjs_typeorm`.`workspaces` query: SET FOREIGN_KEY_CHECKS = 1; query: COMMIT Database schema has been successfully dropped. 혹시 schema:drop, schema:sync 명령어에 경로를 지정하지 않으신 이유가 있으신지, 경로를 빼놓은 상태로 유지하다가, 정말 필요할 때에만 경로 지정하고 명령어를 사용하는게 좋은지가 궁금합니다. 실수로 입력해서 데이터 손실이 발생하는 것을 막기 위해서일까요?

  • node.js
  • express
  • nestjs
  • typeorm
jeongho218 댓글 1 좋아요 0 조회수 347

refresh 토큰이 만료됐는데 만료된 refresh 토큰으로 새로운 refresh 토큰을 발급받는 것인가요..?

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

access token이 만료되었을 떄 refresh 토큰을 통해 access token을 새로 발급 받는 것은 이해가 되는데.. refresh 토큰이 만료되어서 새로운 refresh 토큰을 발급받기 위한 시점에서 만료된 refresh 토큰을 사용할 수 있는 것인가요..? 조금 헷갈리내요..

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
purnsup90 댓글 1 좋아요 0 조회수 553

[토큰 재발급 로직 코딩하기] 토큰 재발급 후 sub 정보 사라짐

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

signToken(user: Pick<UsersModel, 'email' | 'id'>, isRefreshToken: boolean) { const payload = { email: user.email, sub: user.id, type: isRefreshToken ? 'refresh' : 'access', }; return this.jwtService.sign(payload, { secret: JWT_SECRET, // seconds expiresIn: isRefreshToken ? 3600 : 300, }); } async rotateToken(token: string, isRefreshToken: boolean) { const decoded = this.jwtService.verify(token, { secret: JWT_SECRET, }); if(decoded.type !== 'refresh'){ throw new UnauthorizedException('토큰 재발급은 Refresh 토큰으로만 가능합니다!'); } return this.signToken({ ...decoded, }, isRefreshToken); } 토큰 생성 시 payload에서 sub에 user.id 를 할당하고 있는데 재발급시 decoded 객체를 그대로 할당하면 sub 정보가 사라지지 않나요?

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
jhreplay.lee 댓글 1 좋아요 2 조회수 423

async와 await 로직을 사용해야 하는 기준을 잘 모르겠어요

해결됨

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

비동기 로직을 호출만 하고 끝나는게 아니라 결과값을 활용해야할 때 async, await를 활용해야 한다고 이해하고 있는데요. 한가지 이해가 잘 가지 않는 부분이 Auth Service에서 async registerWithEmail( user: Pick<UsersModel, 'nickname' | 'email' | 'password'>, ) { const hash = await bcrypt.hash(user.password, HASH_ROUNDS); const newUser = await this.usersService.createUser({ ...user, password: hash, }); return this.loginUser(newUser); } async 함수는 결국 Promise를 반환하니까 Auth Controller에서 @Post('/register/email') registerByEmail( @Body('nickname') nickname: string, @Body('email') email: string, @Body('password') password: string, ) { return this.authService.registerWithEmail({ nickname, email, password, }); } async, await를 사용하지 않으면 제대로 동작하지 않을 줄 알았는데 비동기 호출의 결과인 token이 잘 반환되더라구요. 혹시 이유를 알 수 있을까요? async, await를 판단하는 강사님 만의 기준이 혹시 있으신지, 그리고 굳이 async, await가 필요 없는 곳에도 사용하게되면 성능의 차이가 생기는지도 궁금합니다.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
jhreplay.lee 댓글 2 좋아요 0 조회수 664

Follow Count Incremet & Decrement 작업하기 - 2 강의 제목과 내용이 맞지 않는 것 같습니다.

해결됨

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요. 강의 덕분에 많은 것을 배우고 좀 더 nestjs에 익숙해질 수 있었습니다. 그런데 Follow Count Incremet & Decrement 작업하기 - 2 강의에서 다룬 내용이 comment count 작업과 관련한 내용이었습니다. Follow Count Incremet & Decrement 작업하기 - 1 마지막에는 다음 시간에 followee count 증가 감소 내용을 다룰 것이라 하셨었거 든요. 강의가 누락된 것 같습니다. 참고해 주세요! ㅎ 좋은 강의 감사합니다. 이어지는 강의도 많이 기대됩니다. 힘내세요!

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
endymion cheon 댓글 1 좋아요 1 조회수 216

UpdatePostDto 관련 질문

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요 강사님! 다름이 아니라, UpdatePostDto 코드 작성하는 부분에서 의문이 생겨 질문 드립니다. UpdatePostDto의 코드를 이렇게 작성을 해주셨는데, 하단에 이 부분이 왜 필요한지가 이해가 되지 않습니다. PartialType(CreatePostDto)만으로도 충분히 CreatePostDto 안에 있는 프로퍼티들을 Optional 프로퍼티들로 바꾸는거 아닌가요?? 더불어 @IsString validator같은 경우에는 엔티티에서 이미 적용을 해주었기에 더욱 필요없지 않나 싶습니다! 따라서 이 두 코드는 동일한 기능을 하는 코드로 생각이 되는데, 이렇게 명시적으로 작성을 하신 이유가 있으신가 해서 여쭤봅니다. 좋은 강의 감사드립니다!

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
복돌 댓글 1 좋아요 2 조회수 358

작업형1 모의문제3 7번문제

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 df = df.T df.head() mean_2001 = df[2001].mean() mean_2003 = df[2003].mean() a = sum(df[2001] > mean_2001) b = sum(df[2003] < mean_2003) print(a+b) 이렇게 작성하면 결과가 다르게 나오는데,, 어디서 잘못된 것일까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
댓글 1 좋아요 0 조회수 354

uploads파일의 이미지 이름 한글 깨짐 질문

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

프론트에서 formData넣기 직전에 파일 객체를 봤을때 한글이 제대로 잘 들어가 있었는데, 이걸 보내고 multer 설정에서 받자마자 바로 destination 메서드와 filename메서드에서 file.originalname을 콘솔 로그로 확인을 해보니 이미 한글이 깨져있더라고요. 그래서 프로젝트 로컬에서 터미널로 chcp 65001 명령어로 인코딩을 utf-8로 바꿔줬는데 그래도 여전히 이미지 파일명의 한글이 깨지던데 시도해볼 다른 방법이 더 있나요?

  • node.js
  • express
  • nestjs
  • typeorm
roider2316 댓글 1 좋아요 1 조회수 2284

getAllPost() 함수 관련 질문 드립니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

// posts.service.ts async getAllPost() { return this.postsRepository.find(); } 안녕하세요, 궁금한 사항이 있어 질문 남깁니다. 위 코드에서 find() 메서드는 Promise를 리턴하니까 service에 존재하는 getAllPost 함수는 Promise를 리턴하게 되지 않나요? 해당 코드를 실제로 돌려보니 return await this.postsRepository.find() 처럼 돌아가는게 이해가 잘 안됩니다. 강의에서는 "컨트롤러에서 바로 반환을 해주기 때문에 async, await을 안 붙혀도 상관이 없다" 라고 말씀해주셨는데, 음... 바로 반환을 하면 Promise가 return되어야 하지 않나란 생각이 듭니다. 이 부분에 대한 부연 설명이 가능할까요? 감사합니다.

  • typescript
  • rest-api
  • nestjs
  • backend
한글영문대소문자 댓글 2 좋아요 0 조회수 633

[음량 문제] 섹션 33 - Chat Entity 생성하기

해결됨

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

음량이 작아지는 강의입니다. 코드팩토리 통합 링크 https://links.codefactory.ai Flutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
김종식 댓글 1 좋아요 0 조회수 349

안녕하세요 AccessToken 관련 질문입니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

안녕하세요 얼마전에 Access Token 관련 질문을 드렸습니다. 저는 Backend 강의만 듣고 있어서 Frontend 강의가 어떻게 진행되었는지 몰라서 여쭤봅니다! 현재 전역 스테이트 변수인 recoil을 사용해서 AccessToken을 저장 중 입니다. 하지만 그냥 recoil만 사용할 때는 새로 고침 시 데이터가 삭제되어서 문제가 되고 있습니다. persistAtom 이라는 속성을 사용해서 상태가 유지되도록 할 수 있다는 것을 알게 되었는데 이렇게 사용할 경우 localstorage에 토큰 값이 그대로 들어가더군요. 그러면 토큰 값이 그대로 노출되어서 보안상 문제가 될 것 같은데 혹시 이게 문제가 안되는지, 그대로 사용해도 되는지 아니면 새로고침시 계속 token이 사라지니까 모든 컴포넌트에 useEffect를 사용해서 restoreAccessToken을 호출하도록 만들면 어떨까요? 다른 방법이 있다면 방향을 알려주세요! 감사합니다.

  • javascript
  • node.js
  • docker
  • rest-api
  • nestjs
댓글 1 좋아요 0 조회수 612

카카오 로그인 serializer 구현

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

안녕하세요 제로초님. passport-kakao를 이용해서 kakao 로그인을 구현해보고 있습니다. 로그인과 회원가입 까지는 잘 되는데, serializer을 통해서 cookie가 저장되지 않습니다. kakako.strategy.ts import { PassportStrategy } from '@nestjs/passport'; import { Strategy } from 'passport-kakao'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import * as _ from 'lodash'; import { AuthService } from './auth.service'; import { Platform } from 'src/entities/common/Platforms'; @Injectable() export class KakaoStrategy extends PassportStrategy(Strategy) { constructor( private readonly configService: ConfigService, private authService: AuthService, ) { super({ clientID: configService.get<string>('KAKAO_REST_API_KEY'), clientSecret: configService.get<string>('KAKAO_CLIENT_SECRET'), callbackURL: configService.get<string>('KAKAO_REDIRECT_URI'), }); } async validate(accessToken, refreshToken, profile, done) { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { _json: { id, properties: { nickname, profile_image: profileImage }, kakao_account: { email }, }, } = profile; const user = await this.authService.findOrCreateUser( email, nickname, Platform.KAKAO, ); return done(null, user); } } 아래에 있는 kakao-auth.guard.ts와 kakao.serializer.ts는 로컬 로그인과 다른 점이 없을 것 같아서 그대로 썼습니다. kakao-auth.guard.ts import { ExecutionContext, Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @Injectable() export class KakaoAuthGuard extends AuthGuard('kakao') { async canActivate(context: ExecutionContext): Promise<boolean> { const can = await super.canActivate(context); if (can) { const request = context.switchToHttp().getRequest(); await super.logIn(request); } return true; } } kakao.serializer.ts import { Injectable } from '@nestjs/common'; import { PassportSerializer } from '@nestjs/passport'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { AuthService } from './auth.service'; import { Users } from 'src/entities/Users'; @Injectable() export class KakaoSerializer extends PassportSerializer { constructor( private readonly authService: AuthService, @InjectRepository(Users) private usersRepository: Repository<Users>, ) { super(); } serializeUser(user: Users, done: CallableFunction) { done(null, user.id); } async deserializeUser(userId: string, done: CallableFunction) { return await this.usersRepository .findOneOrFail({ where: { id: +userId }, select: ['id', 'email', 'nickname'], }) .then((user) => { done(null, user); }) .catch((error) => done(error)); } } 이처럼 작성하면, 로그인 시 세션에 쿠키가 저장되어야 하는게 아닌가요? 사실 강의에서 설명해주신 내용중 이해가 잘 가지 않는 부분이 있습니다. localStrategy에서 done(null, user) -> local-auth.guard.ts에서 super.logIn(request) -> local serializer 에서 serializeUser() 을 호출한다고 말씀하셨는데, 세 가지 파일에서 LocalStrategy, LocalAuthGuard, LocalSerializer을 서로 명시적으로 연결해준적이 없음에도 불구하고 어떻게 서로 잘 알아서 호출되는지 궁금합니다. 그냥 앞에 모두 Local이 붙어서, 잘 찾아서 호출되는 건가요?

  • node.js
  • express
  • nestjs
  • typeorm
이민석 댓글 1 좋아요 0 조회수 578

ManyToMany 테이블이 자동으로 만들어지지 않습니다..

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

import { ProductCategory } from 'src/apis/productsCategories/entites/productCategory.entity'; import { ProductSaleslocation } from 'src/apis/productsSaleslocations/entities/productSaleslocation.entity'; import { ProductTag } from 'src/apis/productsTags/entities/productTag.entity'; import { User } from 'src/apis/users/entities/user.entity'; import { Column, Entity, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToOne, PrimaryGeneratedColumn, } from 'typeorm'; @Entity() export class Product { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; @Column() description: string; @Column() price: number; @Column({ default: false }) isSoldout: boolean; @JoinColumn() // 1:1 연결에서는 두 테이블 중 중심을 정하는 JoinColumn을 달아주어야한다. @OneToOne(() => ProductSaleslocation) // 일대일 연결. 어떤 테이블이랑 연결될지 표기. ProductSaleslocation 테이블과 연결 할 것이다. productSaleslocation: ProductSaleslocation; // 그 때 사용되는 Column은 productSaleslocation이고 타입은 다음과 같다, FK @ManyToOne(() => ProductCategory) // many가 Product 한개인게 Category productCategory: ProductCategory; // FK @ManyToOne(() => User) user: User; @JoinTable() // ManyToMany는 둘 중 하나에 JoinTable 작성 @ManyToMany(() => ProductTag, (productTags) => productTags.products) // 상대방 입장에서 나를 볼 때 products productTags: ProductTag[]; // 객체가 여러개이기 떄문에 객체 배열타입 사용 } import { Product } from 'src/apis/products/entities/product.entity'; import { Column, Entity, ManyToMany, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class ProductTag { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; @ManyToMany(() => Product, (products) => products.productTags) products: Product[]; } ManyToMany 설정했는데.. product_product_tags_product_tag 테이블이 자동으로 생성이 안되네요. 코드 말고 건드려줘야 할 부분이 있나요?

  • javascript
  • node.js
  • docker
  • rest-api
  • nestjs
karmesin924 댓글 2 좋아요 0 조회수 449

인기 태그

인프런 TOP Writers

주간 인기글