묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
면접볼 떄 알아햐 하는 것
CS는 기본으로 물어볼테고,node 개발자라면 node,자바스크립트 개념,뜻,장점,단점,예시 같은거 알면 되나요?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Entity, Dto 관련해서 궁금증이 있습니다! (오류 사항은 아니지만.. 갑자기 궁금해져서 글을 남기게 되었습니다.)
안녕하세요. 해당 강의를 보다가 궁금증이 생겨서 글을 남기게 되었습니다.Entity는 디비 테이블의 컬럼들을 작성(실제 컬럼 및 디비에 없는 컬럼들까지)하고 Dto는 요청에서 받는 타입들을 작성하고 해당 타입들을 Controller 전에 검증해주는 클래스라고 알고 있었습니다. 궁금한건 아래 2가지 인 것 같습니다.Entity는 디비 테이블의 컬럼을 / Dto는 타입 검증을 위한 데코레이터들을 작성하는 클래스로 분리되는 개념으로 생각해왔었는데 잘 못 생각하고 있었던건가요??만약, Dto 클래스에 있는 컬럼들을 생략하면 nickName?: string; 처럼 선택적 옵션들과 @IsString()등 타입 검증을 해주는 데코레이터들을 전부 Entity에 작성해주는 건가요?? 저는 Entity는 건들이지 않고 Dto에서 선택적 옵션과 타입 검증들의 데코레이터를 사용하고 있었어서 궁금해졌습니다..!
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
npm run seed 실행해도 테이블의 기본값이 생성되지 않는 이유가 뭔가요..??
안녕하세요.npm run seed를 실행하면 아래와 같은 내용만 나오고 기본 값 생성이 되지 않습니다. 에러 메세지가 Unknown arguments: d, seed 이것뿐인 것 같은데.. 알 수 없는 인수.. d, seed가 무슨 말인지 모르겠습니다.a-nest@0.0.1 seed > ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed -d ./dataSource.ts Usage: typeorm-extension <command> [options] Commands: typeorm-extension db:create Create database. typeorm-extension db:drop Drop database. typeorm-extension seed:run Populate the database with an initial data set or generated data by a factory. typeorm-extension seed:create Create a seeder file. Options: -h, --help Show help [boolean] -v, --version Show version number [boolean] Unknown arguments: d, seed dataSource.tsimport { DataSource } from 'typeorm'; import dotenv from 'dotenv'; import { ChannelChats } from './src/entities/ChannelChats'; import { ChannelMembers } from './src/entities/ChannelMembers'; import { Channels } from './src/entities/Channels'; import { DMs } from './src/entities/DMs'; import { Mentions } from './src/entities/Mentions'; import { Users } from './src/entities/Users'; import { WorkspaceMembers } from './src/entities/WorkspaceMembers'; import { Workspaces } from './src/entities/Workspaces'; dotenv.config(); const dataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: [ ChannelChats, ChannelMembers, Channels, DMs, Mentions, Users, WorkspaceMembers, Workspaces, ], migrations: [__dirname + '/src/migrations/*.ts'], charset: 'utf8mb4_general_ci', synchronize: false, logging: true, }); export default dataSource; create-initial-data.tsimport { Seeder, SeederFactoryManager } from 'typeorm-extension'; import { DataSource } from 'typeorm'; import { Workspaces } from '../../entities/Workspaces'; import { Channels } from '../../entities/Channels'; export default class UserSeeder implements Seeder { public async run( dataSource: DataSource, factoryManager: SeederFactoryManager, ): Promise<any> { const workspacesRepository = dataSource.getRepository(Workspaces); await workspacesRepository.insert([ { id: 1, name: 'Sleact', url: 'sleact', }, ]); const channelsRepository = dataSource.getRepository(Channels); await channelsRepository.insert([ { id: 1, name: '일반', WorkspaceId: 1, private: false, }, ]); } } .envSECRET=제로초강의 PORT=3095 DB_USERNAME=root DB_PASSWORD=password DB_DATABASE=sleact package.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", "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js", "db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create -d ./dataSource.ts", "db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop -d ./dataSource.ts", "seed": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed -d ./dataSource.ts", "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop", "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync", "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts", "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts", "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/", "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts" }, "dependencies": { "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/swagger": "^7.1.2", "@nestjs/typeorm": "^10.0.0", "bcrypt": "^5.1.0", "class-validator": "^0.14.0", "mysql2": "^3.6.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "swagger-ui-express": "^5.0.0", "typeorm-extension": "^3.0.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": "^5.59.11", "@typescript-eslint/parser": "^5.59.11", "eslint": "^8.42.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "jest": "^29.5.0", "prettier": "^2.8.8", "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", "typeorm-model-generator": "^0.4.6", "typescript": "^5.1.3", "webpack": "^5.88.2", "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" } } 혹시 경로를 못찾는 건가 싶어서 데이터소스 파일쪽에 seeds의 경로를 넣어주려고 했으나 seeds에 오류가 발생해서 다시 원복 시켰었습니다.(src>database>seeds>create-initial-data.ts 파일은 제로초님 깃에서 복붙했습니다.)강의에서 듣기로는 dataSource > create-initial-data 로 넘어가면서 기본 값이 생성된다고 들었는데요 어디 부분을 확인해봐야 할까요??
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
의존성주입으로 발생하는 장점 설명 질문
발생하는 장점을 다음과 같이 설명해주셨는데요.1. new 한 번으로 모든 곳에서 재사용 가능2. 의존성 주입으로 몽땅 한꺼번에 변경 가능다음과 같은 예시를 들어주셨는데, ProductController의 constructor에서 this.cashService = new CashService()와 같은 사용을 하면 constructor에서 변경점을 가져가고 해당 클래스의 모든 함수에서는 this.cashService를 통해 사용할 수 있고요.class ProductController { cashService constructor() { this.cashService = new CashService() } }CashService 대신 CashService2로 변경하고 싶을때는 다음처럼 변경하면 2번 장점도 동일해지구요.class ProductController { cashService constructor() { //this.cashService = new CashService() this.cashService = new CashService2() } }의존성 주입을 통해 얻을 수 있는 이점은 위와 같은 재사용이나 변경에 대한 장점보다도 말 그래도 의존성을 없애는 것에 있다고 보는데요.의존성 주입을 통해 ProductController에서 구현체인 CashService에 대한 의존성을 없애고, 외부에서 CashService에 대한 의존성을 가져갈 수 있게 되니까요.CashService에 대한 코드의 변경으로 인한 ProductController의 코드 변경이 발생하지 않도록 하는 것이 의존성 주입의 핵심이라고 보는데, tight-coupling을 왜 loose-coupling으로 변경해주어야 하는지에 대한 설명은 없었던 거 같아서요. 이 부분에 대해 어떻게 생각하시는지 궁금합니다!
-
미해결따라하며 배우는 NestJS
XML파일도 링크 공유해주시면 감사하겠습니다.
안녕하세요?인프런 수업자료 페이지에서 받은 파일이 모두 비어있어커뮤니티에서 검색을 해보니강사님께서 PDF파일 링크를 올려주신 답변을 찾았는데PDF파일은 중간중간 글자가 짤리는부분이 좀 있는 듯 하여 DrawIo로 XML파일 불러와서 봐보고싶은데 XML파일은 링크를 찾을수가 없더라구요~XML파일도 링크 공유해주시면 감사하겠습니다. Nest 처음 공부하는데 강사님 강의 정말 도움 많이 되고 있습니다. 감사합니다!
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
DB 생성시 Error: Cannot find module './index.js 가 계속 뜨는데 뭐가 문제인가요??
강의를 듣던 도중 npm run db:create를 실행시켰는데 아래 에러 메세지가 나옵니다.> a-nest@0.0.1 db:create > ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:create -d ./dataSource.ts node:internal/modules/cjs/loader:942 throw err; ^ Error: Cannot find module './index.js' Require stack: - C:\nestStudy\slack-clone-app\a-nest\node_modules\typeorm-extension\dist\cli\imaginaryUncacheableRequireResolveScript at Module._resolveFilename (node:internal/modules/cjs/loader:939:15) at Function.resolve (node:internal/modules/cjs/helpers:108:19) at requireResolveNonCached (C:\nestStudy\slack-clone-app\a-nest\node_modules\ts-node\dist\bin.js:549:16) at getProjectSearchDir (C:\nestStudy\slack-clone-app\a-nest\node_modules\ts-node\dist\bin.js:519:40) at phase3 (C:\nestStudy\slack-clone-app\a-nest\node_modules\ts-node\dist\bin.js:267:27) at bootstrap (C:\nestStudy\slack-clone-app\a-nest\node_modules\ts-node\dist\bin.js:47:30) at main (C:\nestStudy\slack-clone-app\a-nest\node_modules\ts-node\dist\bin.js:33:12) at Object.<anonymous> (C:\nestStudy\slack-clone-app\a-nest\node_modules\ts-node\dist\bin.js:579:5) at Module._compile (node:internal/modules/cjs/loader:1105:14) at Module._extensions..js (node:internal/modules/cjs/loader:1159:10) { code: 'MODULE_NOT_FOUND', requireStack: [ 'C:\\nestStudy\\slack-clone-app\\a-nest\\node_modules\\typeorm-extension\\dist\\cli\\imaginaryUncacheableRequireResolveScript' ] } Node.js v18.0.0 package.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", "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js", "db:create": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:create -d ./dataSource.ts", "db:drop": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:drop -d ./dataSource.ts", "seed": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts", "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop", "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync", "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts", "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts", "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/", "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts" }, "dependencies": { "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/swagger": "^7.1.2", "@nestjs/typeorm": "^10.0.0", "mysql2": "^3.6.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "swagger-ui-express": "^5.0.0", "typeorm-extension": "^3.0.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": "^5.59.11", "@typescript-eslint/parser": "^5.59.11", "eslint": "^8.42.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "jest": "^29.5.0", "prettier": "^2.8.8", "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", "typeorm-model-generator": "^0.4.6", "typescript": "^5.1.3", "webpack": "^5.88.2", "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" } } index.js 를 못 찾는다는 에러같은데 어디 부분이 잘 못된건지 모르겠습니다ㅠ이 에러 때문에 테이블들도 생성되지 않았습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
포트포워딩
안녕하세요 3306포트로 했을때는 정상작동해서단순 호기심으로 3306포트를 3307포트로 바꿔서 해보았는데 다음과 같은 에러가 뜨고 안되네요..다른 설정은 다 그대로고 포트번호만 바꾸었는데도 안되는 이유가뭘까요?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
spec.ts 파일이 자동으로 생기는데 왜 생기는 건가요??
안녕하세요. 강의를 따라하면서 파일을 생성할때 항상 아래 이미지처럼 spec.ts 파일이 자동으로 생성되는 이유가 뭔가요?? 강사님은 안 생기시는 것 같은데 저는 1개 파일당 1개씩 전부 생겨버려서 너무 많은 양의 파일들이 만들어집니다..
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
exception filter에 잡히질 않습니다
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, } from '@nestjs/common'; import { Request, 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 request = ctx.getRequest<Request>(); const status = exception.getStatus(); const error = exception.getResponse() as | string | { error: string; statusCode: number; message: string | string[] }; if (typeof error === 'string') { response.status(status).json({ statusCode: status, timestamp: new Date().toISOString(), path: request.url, message: error, }); } else { response.status(status).json({ statusCode: status, timestamp: new Date().toISOString(), path: request.url, message: error, }); } } }안녕하세요 ! 위와 같이 필터 작성이후main.ts 에서app.useGlobalFilter(new HttpExceptionFilter());를 통해 예외가 잘 잡히는것을 확인을 했었습니다.왜인지는 모르겠으나 cat의 모델 내부 필드중에 imgUrl 부분을 null 을 허용해주기 위해@IsOptional() 을 붙여주고난 뒤에 중복 회원가입을 진행하려 할 경우 예외에 잡히게끔 하려 HttpException 을 발생 시키게끔 했습니다.async signUp(body: CatRequestDTO): Promise<Cat> { const email = body.email; const checkExist = await this.catRepository.findOne({ where: { email } }); if (!checkExist) { const createdCat = this.catRepository.create(body); this.catRepository.save(createdCat); return createdCat; } else { throw new HttpException( 'Already exist Email in DB', HttpStatus.BAD_REQUEST, ); } }콘솔창에 에러 메세지와 함께 출력되는것은 확인되나Filter에서 exception @Catch 로 묶어준것에 잡히지를 않습니다. 도통 이유를 못찾겠어서 app.useGlobalFilter(...) 를 catController 쪽에 @UseFilters(new HttpExceptionFilter()) 로도 바꿔보고메서드에다가 직접적으로도 붙여보았으나 계속 똑같은 현상을 보이는데왜 인지를 못잡겠습니다. 조언을 좀 주시면 감사하겠습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
상품삭제 API 강의에서 소프트 삭제 관련 질문
TypeORM을 이용한 소프트 삭제에서 softRemove와 softDelete를 이용하는 방법 두가지가 있는데, 강의에서는 softDelete를 이용하는 경우에 대해 설명을 해주셨는데요.softRemove를 하는 경우에도 entity에 똑같이 @DeleteDateColumn 으로 deleteAt을 추가해주면 되나요?@RemoveDateColumn은 내장되어 있지 않은것 겉더라구요..그리고 softRemove 에서는 .affected 가 안되던데 true 나 false로 리턴받을 수 있는 방법이 있을까요?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
npm run start:dev 에러
터미널에 npm run start:dev 를 입력하면 자꾸 Error: Cannot find module 라는 에러가 뜹니다;;npm를 지웠다 깔기도 하고, node module 폴더를 삭제하기도하고, lock.json 파일을 삭제해보기도 했는데 여전히 계속 에러가 뜨는데 왜 이런건가요?.....
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
nestjs graphql API 요청 관련 질문
안녕하세요. express 에서 rest 방식에서는 API를 생성할 때, get이나 post 등의 메소드 방식을 정하고 주소를 지정하여 프론트엔드에서 fetch 나 axois 함수에 주소를 기입하여 API 요청을 했었습니다.graphQL 방식의 nestjs에서는 프론트엔드에서 API 요청을 보낼 때 어떤 방식으로 하나요? 따로 주소 같은 것을 지정해주지는 않는 것같은데..똑같이 fetch 나 axois 함수를 통해 요청을 하는 건가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
완강하고 공부할거 질문입니다
완강하면 코테,CS 준비하면 되나요?근데 코테 언어는 어떤 걸로 준비해야 할까요
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
docker 명령어 에러 떠요
docker rm `docker ps -a- q'라고 입력했는데 unknown shorthand flag: 'a' in -a- 라고 에러 뜹니다
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
jwtstrategy error
안녕하세요 원두멘토님ㅎㅎ 이런 에러가 계속 떠서 docs와 스텍오버플로우에 검색을 해보니 Passport-jwt를 import하는 것이 아닌 passport-local을 import하는 것이라해서 했더니 다행히 실행이 됩니다.수업내용에서는 passport-jwt로만 해도 작동이 잘되는 것 같은데 왜 이런 문제가 생기는 것일까요?그리고 passport-local로 하면 실제 배포에서는 사용 못하는 것이 아닌지 질문을 남깁니다.p.s 재작년에 코캠2기 수료하고 백엔드를 많이 기다렸는데 이렇게 인프런에서 다시 인강으로 뵙게 되서 너무 반갑습니다
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
몽구스 객체값 저장하기
cheerio로 가져온값을 객체로 만든다음 밖으로 보내서 최종적으로 몽구스로 저장하고싶은데문제가 생겼던게 저상태로 보내면 [object:object] 로 나오므로 JSON.stringfy()작업으로 문자열 형태로 내보내 주었습니다. 하지만 schema부분을 object로 하여도 object가 가장 상위의 데이터 타입으로 string형태로 저장된다고 여겨졌습니다. 그래서 JSON.stringfy()로 빼내고 저장하는 부분에서 JSON.parse로 하여 다시 저장할려 했지만 다시 [object:object]로 나와서 이부분을 어떻게 해결해야할지 잘찾아봐도 모르겠어서 질문 남겼습니다.// siteInfo.js import axios from "axios"; import cheerio from "cheerio"; export class SiteInfo { siteInfo = async (prefer) => { console.log(prefer); const siteData = await axios .get(prefer) .then() .catch((err) => { console.log("서버 데이터 안받아와짐 오류 : " + err); }); const keys = []; const values = []; const $ = cheerio.load(siteData.data); $("meta").each((index, el) => { if ( $(el).attr("property") && ($(el).attr("property").includes("og:title") || $(el).attr("property").includes("og:description") || $(el).attr("property").includes("og:image")) ) { const content = $(el).attr("content"); const title = $(el).attr("property"); keys.push(title); values.push(content); } }); const arr = []; for (let i = 0; i < keys.length; i++) { arr.push({ [keys[i]]: values[i], }); } console.log("여기 테스트 : " + arr); return arr; }; } // signup.controller.js export class SignupController { siteInfoService; isValueService; saveDataService; emailService; constructor(siteInfoService, isValueService, saveDataService, emailService) { this.siteInfoService = siteInfoService; this.isValueService = isValueService; this.saveDataService = saveDataService; this.emailService = emailService; } singUp = async (req, res) => { const name = req.body.name; const email = req.body.email; const personal = req.body.personal; const prefer = req.body.prefer; const pwd = req.body.pwd; const phone = req.body.phone; console.log(req.body); const hasValue = this.isValueService.checkToken(phone); if (hasValue === false) { res.json("isAuth값이 false입니다"); } const siteInfo = await this.siteInfoService.siteInfo(prefer); const ttt = JSON.parse(siteInfo); console.log("여기 문제 발생 : " + typeof ttt); console.dir("여기 문제 발생 22222: " + ttt); const dataSave = await this.saveDataService.dataSave({ name, email, personal, prefer, pwd, phone, siteInfo, }); const isValue = this.emailService.checkMail(email); if (isValue === false) { res.send("이메일 형식이 잘못되었습니다"); } const template = this.emailService.welcomeMessage({ name, phone, prefer }); this.emailService.sendTemplateToEmail({ template, email, }); res.send("_id : " + dataSave); }; userSearch = async (req, res) => { const searchReault = await this.saveDataService.dataSearch(); console.log(searchReault); res.send(searchReault); }; } // index.js import express from "express"; import mongoose from "mongoose"; import cors from "cors"; // import { Token, User } from "./mvc/model/schema.model.js"; import { TokenController } from "./mvc/controller/token.controller.js"; import { SignupController } from "./mvc/controller/signup.controller.js"; // 사이트 정보 가져오기 import { SiteInfo } from "./mvc/controller/service/siteInfo.js"; // 핸드폰 정보 맞는지 boolean으로 import { CheckToken } from "./mvc/controller/service/token.js"; // db저장하고 리턴값 가져오기 import { UserDb } from "./mvc/controller/service/userDb.js"; // 이메일 확인하고 보내주기 import { EmailService } from "./mvc/controller/service/email.js"; // 핸드폰 문자 보내기 import { PhoneService } from "./mvc/controller/service/phone.js"; const app = express(); const corsOptions = { origin: "http://127.0.0.1:5500", }; app.use(cors(corsOptions)); const siteInfo = new SiteInfo(); const checkToken = new CheckToken(); const userDb = new UserDb(); const emailService = new EmailService(); const phoneService = new PhoneService(); app.use(express.json()); const signUpController = new SignupController( siteInfo, checkToken, userDb, emailService ); app.post("/users", signUpController.singUp); app.get("/users", signUpController.userSearch); const tokenController = new TokenController(phoneService, checkToken); app.post("/tokens/phone", tokenController.insertdata); app.patch("/tokens/phone", tokenController.checkToken); mongoose.set("debug", true); mongoose .connect("mongodb://mongodb-file:27017/dockerconnetor") .then(() => { console.log("connect success"); }) .catch(() => { console.log("fail to connect with db"); }); app.listen(3001, () => { console.log("server open"); }); // userDb.js import { User } from "../../model/schema.model.js"; export class UserDb { dataSave = async ({ name, email, personal, prefer, pwd, phone, siteInfo, }) => { const siteInforesult = JSON.parse(siteInfo); console.log("여기 확인 : " + siteInforesult); const data = new User({ name: name, email: email, personal: personal, prefer: prefer, pwd: pwd, phone: phone, siteInfo: siteInfo, }); await data.save(); const idData = await User.findOne({ phone: phone }, { _id: 1 }).exec(); return idData._id; }; dataSearch = async (name) => { console.log("start datasearch"); const result = await User.find().exec(); return result; }; } // schema.model.js import mongoose from "mongoose"; const tokenSchema = new mongoose.Schema({ phone: String, token: Number, isAuth: Boolean, }); export const Token = mongoose.model("Token", tokenSchema); const userSchema = new mongoose.Schema({ name: String, email: String, personal: String, prefer: String, pwd: String, phone: String, siteInfo: { title: String, content: String, image: String, }, }); export const User = mongoose.model("User", userSchema);
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
docker 이미지는 한개만 만들 수 있나요?
docker 빌드하고 이미지를 4시간 전에 만들었는데방금 또 빌드하고 이미지 했더니 4시간 전에 만든거라고 나왔어요.그리고 IMAGES ID도 똑같네요
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
자바스프링 병행
지금 nodejs 듣고 있는데제가 중소기업해서 취업해서 나중에 대기업 가고 싶은데일단 중소기업 취업 먼저 생각해보면 node만 공부하는게 낫나요
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
백엔드는 명령어 많이 알아야 하나요?
vscode에서 명령어 입력하고 docker 실행 명령어도 입력했는데 powershell이나 다른 프로그램에서도 명령어 많이 알아야하나요
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
다음 에러나시는 분들 참고하세요: "Error: Can't add new command when connection is in closed state"
제가 아래 순서대로 진행하여 해결했습니다.https://www.npmjs.com/package/typeorm-extension 의 스크립트를 참고하였는가MySQL hosts파일에 ::1이 localhost로 바인딩되어있는 부분을 주석처리하기이게 어려우면 localhost대신 루프백주소를 넣으세요이래도 안되면 에러 코드 다시 읽어보기그래도 안되면 chatGPT한테 물어보기참고로, 강사님이 쓰는 extension이랑 최신버전이랑 사용법이 약간 다른 것 같은데 자세히는 아직 안봤지만 각자 1번은 무조건 확인하십쇼