묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
MySQL이 연결되지않습니다
Error: connect ECONNREFUSED ::1:3306at TCPConnectWrap.afterConnect [as oncomplete] 라는 오류가 뜹니다상황설명 : create~~ 가 뜨면서 sleact DB가 만들어졌다가 3306이 이미 써져있어서 그렇다라는 글을 보고 sudo killall mysqld 를 썼다가 DB가 다 날라가고 나서 다시 MySQL을 깔고 db:create, start:dev를 하였더니 똑같이 저런 오류가 뜹니다..import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { LoggerMiddleware } from './middlewares/logger.middlware'; import { UsersModule } from './users/users.module'; import { WorkspacesModule } from './workspaces/workspaces.module'; import { ChannelsModule } from './channels/channels.module'; import { DmsModule } from './dms/dms.module'; import { UsersService } from './users/users.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Users } from './entities/Users'; import { WorkspaceMembers } from './entities/WorkspaceMembers'; import { ChannelChats } from './entities/ChannelChats'; import { ChannelMembers } from './entities/ChannelMembers'; import { Channels } from './entities/Channels'; import { DMs } from './entities/DMs'; import { Mentions } from './entities/Mentions'; import { Workspaces } from './entities/Workspaces'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), UsersModule, WorkspacesModule, ChannelsModule, DmsModule, TypeOrmModule.forRoot({ 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, ], synchronize: true, logging: true, keepConnectionAlive: true, charset: 'utf8mb4_general_ci', }), TypeOrmModule.forFeature([Users]), ], controllers: [AppController], providers: [AppService, ConfigService, UsersService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(LoggerMiddleware).forRoutes('*'); } } DB_USERNAME=root DB_PASSWORD=저의 비밀번호입력했습니다 DB_DATABASE=sleact PORT=3000
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
설명하시는 소스 git 주소 어디에 있을까요
설명하시는 소스 git 주소 어디에 있을까요커뮤니티 검색해 봤는데 안나오네요...
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeorm 설치하고 설정하는 강의가 어떤건지 알려주세요!
안녕하세요. 제로초님의 강의를 다 들었었는데요.typeorm 설치하고 설정하는 강의가 있었던 것 같은데 어떤 강의인지 알려주실 수 있나요??
-
미해결따라하며 배우는 NestJS
No repository for 질문
RepositoryNotFoundError: No repository for "BoardRepository" was found. Looks like this entity is not registered in current "default" connection? at RepositoryNotFoundError.TypeORMError [as constructor] (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\src\error\TypeORMError.ts:7:9) at new RepositoryNotFoundError (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\src\error\RepositoryNotFoundError.ts:10:9) at EntityManager.getRepository (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\src\entity-manager\EntityManager.ts:964:19) at Connection.getRepository (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\src\connection\Connection.ts:354:29) at InstanceWrapper.useFactory [as metatype] (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\node_modules\@nestjs\typeorm\dist\typeorm.providers.js:16:34) at Injector.instantiateClass (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\node_modules\@nestjs\core\injector\injector.js:368:55) at callback (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\node_modules\@nestjs\core\injector\injector.js:65:45) at processTicksAndRejections (node:internal/process/task_queues:95:5) at Injector.resolveConstructorParams (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\node_modules\@nestjs\core\injector\injector.js:144:24) at Injector.loadInstance (C:\Users\jungw\OneDrive\바탕 화면\nestjs-board-app\node_modules\@nestjs\core\injector\injector.js:70:13)검색을 여러번 해 봤더니 typeorm을 0.2버전으로 바꾸라고 하셔서 npm install typeorm@0.2.45 --save로 했는데 다운로드 이후에 npm show typeorm version을 했을 때 0.3.17버전이 나오더라구요 혹시 버전이 바뀌지 않았던 것인지 아니면 그냥 다른 이유때문에 되지 않는것인지 궁금하네요...
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
서비스 파일의 쿼리 빌더 관련 질문입니다.
안녕하세요.강의를 듣던 도중 갑자기 궁금한게 생겨서 글을 남기게 되었습니다.service 파일에서는 어떤 서비스의 로직만을 구현하는 것으로 들었었습니다.다만 해당 강의에서는 service 파일에 로직 + 쿼리빌더로 쿼리까지 사용하는 부분에서 repository.ts 파일을 따로 만들어서 분리시킬 필요는 없는건가요??
-
미해결따라하며 배우는 NestJS
특정 게시물을 찾을 때 없는 경우 에러 메세지 생성 에러
아래와 같이 NotFoundException()을 설정해줬는데요,에러 메세지에 작성한 텍스트로 나오지 않습니다.Delete는 message에 잘 찍혀서 나오는데 GET만 안되네요..같은 문제 있으셨던 분 계시나요? getBoardById(id: string): Board { const found = this.boards.find((board) => board.id === id); if (!found) { throw new NotFoundException('게시물 없음'); } return found; }{ "message": "Cannot GET /boards/wefqwefe", "error": "Not Found", "statusCode": 404 }{ "name": "project-test", "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": "nest start --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/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "uuid": "^9.0.0" }, "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", "eslint": "^8.42.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.5.0", "prettier": "^3.0.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" }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } }
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
로그인 테스트 중 발생했던 express-session 관련 질문입니다!
안녕하세요.로그인 코드 작성 완료 후 테스트로 포스맨을 호출했을 때 2가지 오류가 발생했었습니다.Error: Login sessions require session support. Did you forget to use express-session middleware?secret option required for sessions 1번은 express-session 아래에 passport를 작성하라는 것 같아서 강사님의 깃 보고 아래 코드를 추가했었고 app.use(cookieParser()); app.use( session({ resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, }, }), ); 2번은 검색해보니 secret 설정을 하면 된다고 해서 .env 파일에 COOKIE_SECRET에 대한 값을 넣어줘서 1,2번 전부 해결했었습니다. 다만, 강의에는 이미 들어가있던 부분이였던 아래 코드와 passport.session을 같이 사용하는 이유가 궁금합니다! passport.session만 사용하니 express session의 미들웨어를 사용하라는 것 같았고, express session을 찾아보니 express session만 사용해서 로그인을 구현하기도 하는 것 같았습니다.app.use(cookieParser()); app.use( session({ resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, }, }), ); 그리고 secret는 express session의 암호로만 알고 있어도 되는걸까요? .env 파일에 제가 임으로 설정한 암호를 예를들어 COOKIE_SECRET=12314 이런식으로 작성해놓는게 맞는건가요?? ++ 그리고 수업 별개로 추가 질문 사항이 있습니다!현재 강의에서 사용되는거는 typeORM 0.3 버전인가요? 실무에서는 0.2 버전보다 0.3으로 많이 사용되는건가요??
-
해결됨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 로 넘어가면서 기본 값이 생성된다고 들었는데요 어디 부분을 확인해봐야 할까요??
-
미해결따라하며 배우는 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 를 못 찾는다는 에러같은데 어디 부분이 잘 못된건지 모르겠습니다ㅠ이 에러 때문에 테이블들도 생성되지 않았습니다.
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
spec.ts 파일이 자동으로 생기는데 왜 생기는 건가요??
안녕하세요. 강의를 따라하면서 파일을 생성할때 항상 아래 이미지처럼 spec.ts 파일이 자동으로 생성되는 이유가 뭔가요?? 강사님은 안 생기시는 것 같은데 저는 1개 파일당 1개씩 전부 생겨버려서 너무 많은 양의 파일들이 만들어집니다..
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
One-to-Many Self Referencing 문제
안녕하세요 One-to-Many 관계 정의 시에 해결이 잘 안되서 문의 드립니다. Typeorm 사이트에서 정보를 참조도 해보고 구글링도 해봐서 시도해봤지만 명확하게 원하던 결과가 나오지 않아서 문의드립니다.@Entity("Parts", { schema: "workplaces" }) export class Parts { @PrimaryColumn('varchar', { name: "partsNumber", unique: true, nullable: false }) partsNumber: string; @Column('varchar', { name: 'partsName', length: 500, nullable: true }) name: string; @Column('bool', { name: 'isMain', nullable: false, default: false }) isMain: boolean; @CreateDateColumn() createDate: Date; @UpdateDateColumn() updateDate: Date; @DeleteDateColumn() deleteDate: Date | null; // 여기부터가 문의 드리는 One to Many 관계설정 코드입니다. @ManyToOne(() => Parts, (parts) => parts.alternative, { onDelete: "SET NULL", onUpdate: "CASCADE" }) parts: Parts; @OneToMany(() => Parts, (alternative) => alternative.parts) @JoinColumn([{ name: "alternative", referencedColumnName: "partsNumber" }]) alternative: Parts[]; }보시면 아시겠지만, Parts 테이블에 alternative란 항목의 다수의 Parts 타입을 데이터로 받도록 구성한 것인데요, 부품의 경우, 대체 부품이 여럿이 존재해서 isMain 항목을 통해서 부품이 main부품일 경우에만 데이터를 저장하고 호출해주며, main 부품이 아닌경우, 연결된 main parts 의 정보를 호출해주도록 하기 위해서 입니다. 실제로 이렇게 구성할 경우, 아래와 같은 데이터를 저장할시{ "partsNumber": "341241", "name": "341241 Dryer Drum Belt", "isMain": true, "alternative": [ { "partsNumber": "14210003" }, { "partsNumber": "20065315" }, ] }이상없이 저장이 완료됩니다.Main part(parent) 검색시에 보통 사용하던 One to Many에서처럼 alternative에 제대로 2개의 배열객체가 출력이 됩니다만, 문제는 alternative 데이터를 검색하여 main이 되는 part를 출력하지 못하는 점인데요. Self Referencing 으로 One to Many관계를 설정시에 children측에서 parent 쪽의 정보를 호출하려면 어떻게 설정해야 하나요?항상 답변을 주셔서 감사합니다!
-
미해결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번은 무조건 확인하십쇼
-
미해결따라하며 배우는 NestJS
회원가입 기능 구현 중 오류가 났습니다.
No repository for "UserRepository" was found. Looks like this entity is not registered in current "default" connection? service와 module에 UserRepository 모두 설정했고 repository에도 생성을 했는데 왜 못찾는지 모르겠습니다.이런 오류 발생했을때는 어느 부분을 확인해봐야 할까요?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
런타임시 타입스크립트 인터페이스가 존재하지 않는 이유는 뭔가요??
안녕하세요. 해당 강의와는 별개의 질문입니다! 클래스와 인터페이스의 차이가 런타임이 존재하는지의 여부라고 아래 답변해주신 글을 봤었습니다.가장 큰 차이는 interface는 런타임에 없고, class는 런타임에 있는 것입니다. 런타임에 있어서 런타임에도 타입체크를 수행하길 원하면 class로 선언하면 되고, 런타임에는 없길 원하면 interface를 쓰시면 됩니다. 위 답변에서 궁금한점이 타입스크립트 인터페이스가 런타임에 없는 이유가 뭔가요??컴파일시 자바스크립트 파일에서 인터페이스가 삭제되면서 런타임 시 제외가 되는 것인가요? 자바스크립트에는 인터페이스 문법이 없다고 알고 있는데.. 문법이 없기 때문에 컴파일할 수 없어서 삭제되고 런타임에서는 제외가 되는 것인지.. 궁금해져서 조금 더 구체적으로 알고 싶습니다!
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
엔티티 경로에(절대경로와 상대경로) 의한 모듈 인식
import { Channels } from '../../entities/channel.entity'; import { Workspaces } from 'src/entities/workspace.entity'; import { DataSource } from 'typeorm'; import { Seeder, SeederFactoryManager } from 'typeorm-extension'; export default class UserSeeder implements Seeder { async run( dataSource: DataSource, factoryManager: SeederFactoryManager, ): Promise<any> { const workspaceRepository = dataSource.getRepository(Workspaces); await workspaceRepository.insert([ { id: 1, name: 'nest-practice', url: 'nest-practice', }, ]); const channelsRepository = dataSource.getRepository(Channels); await channelsRepository.insert([ { id: 1, name: '개인', WorkspaceId: 1, private: true, }, ]); } }에러 로그 BaseError: Cannot find module 'src/entities/workspace.entity' Require stack: - /Users/jinyoung/Desktop/study/nest/nest-project/src/database/seeds/create-initial-data.ts - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/locter/dist/index.cjs - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/utils/file-path.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/utils/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/factory/module.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/factory/manager.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/factory/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/data-source/options/module.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/data-source/options/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/data-source/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/database/create.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/database/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/index.js - /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/index.js at ModuleLoader.loadSync (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/locter/src/loader/built-in/module/module.ts:179:23) at ModuleLoader.loadSync (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/locter/src/loader/built-in/module/module.ts:172:37) at ModuleLoader.execute (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/locter/src/loader/built-in/module/module.ts:55:31) at async prepareSeeder (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/module.js:58:39) at async runSeeders (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/module.js:111:19) at async Object.handler (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/seed.js:59:9) { options: { code: 'MODULE_NOT_FOUND', message: "Cannot find module 'src/entities/workspace.entity'\n" + 'Require stack:\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/src/database/seeds/create-initial-data.ts\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/locter/dist/index.cjs\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/utils/file-path.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/utils/index.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/factory/module.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/factory/manager.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/factory/index.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/seeder/index.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/data-source/options/module.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/data-source/options/index.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/data-source/index.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/database/create.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/database/index.js\n' + '- /Users/jinyoung/Desktop/study/nest/nest-project/node_modules/typeorm-extension/dist/cli/commands/index.js\n' +해당 코드에서 처음엔 Channels라는 엔티티경로를 인식해오지 못한다고 에러 로그를 받았습니다. 이거저거 해보다가 아 혹시 상대경로로 바꿔주면 인식이 될까? 해서 상대경로로 바꿔 주었더니 Channels가 인식되기 시작했습니다. 궁금한점은 처음 Import해올 당시 제가 경로를 직접입력한것이 아닌 타입스크립트가 자동으로 경로를 잡아주어 import했습니다. 하지만 어째서 타입스크립트가 인식해서 잡아준 경로에 존재하는 모듈을 찾을수 없다고 나오는지 모르겠습니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
dataSource내부 환경변수 인식 불가에 따른 db연결 실패
dataSource.ts import { DataSource } from 'typeorm'; import { ChannelChats } from './src/entities/channelChat.entity'; import { ChannelMembers } from './src/entities/channelMembers.entity'; import { Channels } from './src/entities/channel.entity'; import { DMs } from './src/entities/dm.entity'; import { Mentions } from './src/entities/mention.entity'; import { Users } from './src/entities/user.entity'; import { WorkspaceMembers } from './src/entities/workspaceMembers.entity'; import { Workspaces } from './src/entities/workspace.entity'; import { ConfigService } from '@nestjs/config'; const configService = new ConfigService(); const test = configService.get('DB_HOST'); console.log(test) const dataSource = new DataSource({ type: 'mysql', host: '127.0.0.1', port: 3306, username: configService.get('DB_USER'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_NAME'), entities: [ ChannelChats, ChannelMembers, Channels, DMs, Mentions, Users, WorkspaceMembers, Workspaces, ], migrations: [__dirname + '/src/migrations/*.ts'], synchronize: false, logging: true, });출력 에러 로그 yarn seed yarn run v1.22.19 warning ../../../../package.json: No license field $ ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts undefined !!!!!!!!!!!!!!! Error during Data Source initialization Error: Access denied for user ''@'localhost' (using password: NO) at Packet.asError (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/mysql2/lib/packets/packet.js:728:17) at ClientHandshake.execute (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/mysql2/lib/commands/command.js:29:26) at PoolConnection.handlePacket (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/mysql2/lib/connection.js:478:34) at PacketParser.onPacket (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/mysql2/lib/connection.js:97:12) at PacketParser.executeStart (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/mysql2/lib/packet_parser.js:75:16) at Socket.<anonymous> (/Users/jinyoung/Desktop/study/nest/nest-project/node_modules/mysql2/lib/connection.js:104:25) at Socket.emit (node:events:513:28) at Socket.emit (node:domain:489:12) at addChunk (node:internal/streams/readable:324:12) at readableAddChunk (node:internal/streams/readable:297:9) { code: 'ER_ACCESS_DENIED_ERROR', errno: 1045, sqlState: '28000', sqlMessage: "Access denied for user ''@'localhost' (using password: NO)", sql: undefined } typeorm-extension seed.env NAME=development DB_HOST=localhost DB_NAME=nestdb DB_USER=root DB_PASSWORD=password!!!package.json "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"폴더구조 - node_module - src - .env - dataSource.ts - package.json 출력에러 로그에 보시면 맨위 yarn seed 기준 5번째 줄에 undefined !!!!!! 이런 로그를 확인하실수 있으실텐대 이게 process.env.DB_NAME을 해도 이렇게 나오고 configService.get('DB_NAME')을 해도 undefined로 나오는걸로 확인해본결과 현재 환경변수가 인지가 되지않는 상태라는것을 알아챈 상태까지 왔습니다. 여기서 어떤 부분을 손보면 좋을지 궁금합니다.
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
.env 파일에 3030 포트로 동일하게 작성했지만 사이트에 연결할 수 없음이 나오는데 어디 부분이 빠진 건가요?
안녕하세요. 포트 3000 에서는 사이트도 잘 뜨고 로깅도 잘 되고 있습니다.다만, 환경변수 파일에 추가한 3030 포트로는 열리지 않고 있습니다. 어디 부분을 확인해봐야 되나요??.envSECRET=제로초강의 PORT=3030 main.tsimport { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; declare const module: any; async function bootstrap() { const app = await NestFactory.create(AppModule); const port = process.env.PORT || 3000; await app.listen(3000); console.log(`listening on port ${port}`); if (module.hot) { module.hot.accept(); module.hot.dispose(() => app.close()); } } bootstrap(); app.service.tsimport { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; // 서비스의 경우, 요청과 응답에 대해서는 모르기 때문에 독립적이다. // 즉, 로직을 작성하는 공간이라고 생각하면 된다. @Injectable() export class AppService { constructor(private readonly configService: ConfigService) {} getHello(): string { // process.env.PORT보단 get으로 가져오는 것이 좋다. // return this.configService.get('SECRET'); return process.env.SECRET; } } app.module.tsimport { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { LoggerMiddleware } from './middlewares/logger.middleware'; @Module({ imports: [ConfigModule.forRoot()], controllers: [AppController], providers: [AppService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer): any { consumer.apply(LoggerMiddleware).forRoutes('*'); } } logger.moddleware.tsimport { Injectable, Logger, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; @Injectable() export class LoggerMiddleware implements NestMiddleware { private logger = new Logger('HTTP'); use(request: Request, response: Response, next: NextFunction): void { const { ip, method, originalUrl } = request; const userAgent = request.get('user-agent') || ''; response.on('finish', () => { const { statusCode } = response; const contentLenth = response.get('content-length'); // 만약 context가 필요가 없을 경우 Logger.log가 console.log 대체이다. this.logger.log( `${method} ${originalUrl} ${statusCode} ${contentLenth} - ${userAgent} ${ip}`, ); }); next(); } }
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
핫리로딩으로 공식문서와 동일하게 적용했는데 찾을 수 없다고만 뜨는데 이유가 뭘까요??
핫리로딩으로 공식문서와 동일하게 적용했는데 찾을 수 없다고만 뜨는데 이유가 뭘까요??아래 작성 코드 확인부탁드립니다! 터미널 에러PS C:\nestStudy\slack-clone-app\a-nest> npm run start:dev > a-nest@0.0.1 start:dev > nest build --webpack --webpackPath webpack-hmr.config.js --watch Error Cannot find module 'C:\nestStudy\slack-clone-app\a-nest\webpack-hmr.config.js' Require stack: - C:\nestStudy\slack-clone-app\a-nest\node_modules\@nestjs\cli\actions\build.action.js - C:\nestStudy\slack-clone-app\a-nest\node_modules\@nestjs\cli\actions\index.js - C:\nestStudy\slack-clone-app\a-nest\node_modules\@nestjs\cli\commands\command.loader.js - C:\nestStudy\slack-clone-app\a-nest\node_modules\@nestjs\cli\commands\index.js - C:\nestStudy\slack-clone-app\a-nest\node_modules\@nestjs\cli\bin\nest.js main.tsimport { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; declare const module: any; async function bootstrap() { const app = await NestFactory.create(AppModule); const port = process.env.PORT || 3000; await app.listen(3000); console.log(`listening on port ${port}`); if (module.hot) { module.hot.accept(); module.hot.dispose(() => app.close()); } } bootstrap(); webpack-hmr.config.jsconst nodeExternals = require('webpack-node-externals'); const { RunScriptWebpackPlugin } = require('run-script-webpack-plugin'); module.exports = function (options, webpack) { return { ...options, entry: ['webpack/hot/poll?100', options.entry], externals: [ nodeExternals({ allowlist: ['webpack/hot/poll?100'], }), ], plugins: [ ...options.plugins, new webpack.HotModuleReplacementPlugin(), new webpack.WatchIgnorePlugin({ paths: [/\.js$/, /\.d\.ts$/], }), new RunScriptWebpackPlugin({ name: options.output.filename, autoRestart: false }), ], }; }; 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" }, "dependencies": { "@nestjs/common": "^10.0.0", "@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": "^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", "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" } }