묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
sleact 테이블 생성에 실패 하시는 분들을 위한 팁
강의 4~ 5분 즈음에 sleact 테이블을 생성하는데요아래의 에러 메시지가 나오면서 테이블 생성에 실패 하시는 분들은> a-nest@0.0.1 db:create > ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:create -d ./dataSource.ts /Users/user/Documents/SideProjects/sleact/a-nest/node_modules/mysql2/lib/connection.js:161 const err = new Error( ^ Error: Can't add new command when connection is in closed state at Connection._addCommandClosedState (/Users/gim-uijung/Documents/SideProjects/sleact/a-nest/node_modules/mysql2/lib/connection.js:161:17) at Connection.end (/Users/gim-uijung/Documents/SideProjects/sleact/a-nest/node_modules/mysql2/lib/connection.js:902:26) at Query.onResult (/Users/gim-uijung/Documents/SideProjects/sleact/a-nest/node_modules/typeorm-extension/dist/database/driver/mysql.js:27:28) at Connection._notifyError (/Users/gim-uijung/Documents/SideProjects/sleact/a-nest/node_modules/mysql2/lib/connection.js:241:17) at Connection._handleFatalError (/Users/gim-uijung/Documents/SideProjects/sleact/a-nest/node_modules/mysql2/lib/connection.js:180:10) at Connection._handleNetworkError (/Users/gim-uijung/Documents/SideProjects/sleact/a-nest/node_modules/mysql2/lib/connection.js:193:10) at Socket.emit (node:events:513:28) at Socket.emit (node:domain:489:12) at emitErrorNT (node:internal/streams/destroy:151:8) at emitErrorCloseNT (node:internal/streams/destroy:116:3) {}dotenv 패키지를 설치하세요.npm i dotenvdotenv 설치하는 부분이 편집 과정중 어디선가 생략된것 같아요.아주 간단 한건데 이거 때문에 삽질을 좀 해서 혹시나 도움이 될까 싶어 올립니다.
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
객체를 저장하는 경우도 있나요?
안녕하세요. 혹시 디비에 객체를 저장하는 경우도 있나요? 예를들어 아래처럼 5개의 색상 키와 그 키에 해당하는 string을 값으로 가지는 객체 형태를 유저 정보에 저장하고 싶어요.// Color 객체 예시 입니다. { RED: string; BLUE: string; GREEN: string; YELLOW: string; PURPLE: string; }nest&typeorm는 처음이다보니 chatgpt의 도움을 많이 받고 있는데요. 객체는 저장이 되지 않지만 postgresql 에서는 이런 방법을 알려주긴하더라고요. export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() email: string; // 생략... @Column({ type: 'jsonb', nullable: true }) categories: { [key in Color]: string } | null; // 생략... 이 5개에서 늘어나거나 줄어들일이 없어서 테이블을 만드는게 맞는지 고민이 돼서요. 위와 같이하는건 좀 이상한 방법일까요? 이럴거면 그냥 email:string 하듯이 RED:string 이런식으로 컬럼 5개로 저장하는 방법이 나을까요?
-
미해결따라하며 배우는 NestJS
이 오류는 어떻게 잡아야할까요...
혹시 이런 오류 뜨시는 분은 안계셨나요오류는 없는데 실행이 되질 않습니다ㅜ
-
미해결따라하며 배우는 NestJS
auth 컨트롤러 파일에서 signUp은 ": Promise<~>"를 붙이는데 signIn은 왜 안 붙이시나요?
auth 컨트롤러 파일에서 signUp은 ": Promise<~>"를 붙이는데 signIn은 왜 안 붙이시나요?" : Promise<string> "를 붙여줘야 하는 거 아닌가요?
-
미해결따라하며 배우는 NestJS
구현 완료 후 not a function 오류
구현완료후 postman에서 localhost:3000/auth/signup 에 post 했더니 this.userRepository.createUser is not a function이라는 에러가 납니다. 정확히 모두 따라했는데 왜 에러가 나는지 모르겠습니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
axios로 http 요청시 req,res 로깅하는 방법을 찾고있습니다.
안녕하세요 nest.js 로깅 관련해서 질문 넣을게요 axios로 http 요청 주고받을때 req, res에서 로깅을 하고 싶은데요...검색해보면 https://stackoverflow.com/questions/55431189/nestjs-logging-the-request-response-from-httpservice-callsthis.httpService.axiosRef.interceptors.request.use(config => console.log(config)); 이렇게 사용하라고 추천해주셨는데, 혹시 req,res 로그를 보거나 쌓을 수있는 다른 방법이 있을까요?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
테이블 관계 질문한가지 있습니다!
안녕하세요. 강좌를 바탕으로 개인적으로 토이 프로젝트를 만들어보려고 하고있는데요.지도에 마커로 위치를 표시할수 있고, 마커 하나당 게시글 하나를 포함합니다. 게시글에는 제목, 설명, 사진이 들어갑니다. 프론트에서 지도화면에서는 마커들을 표시하고 마커 하나를 눌렀을때 해당하는 게시글과 사진을 보여주고 싶습니다. 마커 테이블과 게시글 테이블을 만들어서 one to one 관계가 좋을까요, 아니면 이런경우 하나의 테이블에 마커와 게시글 정보를 넣으면 될까요? chatGPT를 사용해봤는데 답변이 두가지입니다.Marker와 Post 테이블 간에 일대일 (one-to-one) 관계를 설정하는것이 좋다. Marker와 Post 테이블을 조인하여 필요한 정보를 가져올 수 있다.하나의 테이블에 마커와 게시글 정보를 함께 저장하고, 해당 정보를 조회할 때는 필요한 컬럼들만 선택하여 조회하는 것이 좋다. 마커 정보와 게시글 정보가 함께 저장되므로, 마커를 클릭하여 게시글 정보를 조회할 때 JOIN 연산이 필요하지 않아 성능상 이점이 있다. 테이블 구조를 어떻게 짜는것이 맞는것인가요? 그리고 테이블 구조 짜는것이 어려운데 이런것을 판단하기 위해 어떻게 학습하면 좋을까요?
-
미해결따라하며 배우는 NestJS
@UseGuards(AuthGuard()) 를 사용하지않고
@UseGuards(AuthGuard()) 를 사용하지않고 Passport jwt 전략을 사용할 순 없나요?영상에서 @UseGuards(AuthGuard()) 등록 전 api request를 하셨는데 그때도 passport를 거쳐간건지 궁금합니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Identifying relation 과 non-identifying relation
안녕하세요! 보여주신 erd에서 궁금증이 생겨서 질문 드립니다.dms의 ReciverId과 mentions의 Receiverid 만 Non-identifying relation으로 맺어져 있고 나머지 관계들은 모두 Identifying Relation으로 맺어져 있는 이유가 뭘까요?Non-Identifying Relation과 Identifying Relation의 차이는 Non의 경우는 부모와 자식의 관계를 맺을때 자식이 부모 없이도 독립적으로 존재 가능한 것이고, Identifying-Relation은 자식이 부모 없이는 존재가 불가능한 차이로 알고 있습니다. DM과 Mention의 Receiver가 존재하지 않는다면, DM과 Mention의 정보가 불완전해질 것 같은데, 왜 non-identifying 일까요?typeorm entity 코드를 봐도, DM과 User entity의 Sender와 Receiver의 코드가 완전 똑같은데, 왜 ERD에서는 Receiver는 non-identifying 이고 Sender는 identifying인지 모르겠습니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
pm2 에러
ec2-ubuntu 환경에서 pm2사용하는데sudo npm run start:prodcross-env NODE_ENV=production PORT=80 pm2 start dist/src/main.js실행하였는데Error: EACCES: permission denied, mkdir '/root/.pm2/logs'Error: EACCES: permission denied, mkdir '/root/.pm2/pids'Error: EACCES: permission denied, open '/root/.pm2/module_conf.json'Error: EACCES: permission denied, mkdir '/root/.pm2/modules'에러가 발생해서 제로초님이 답변하신거 찾아보고 노드 재설치도 했는데같은 에러가 발생합니다
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
dist/main.js 경로
Script not found: C:\Users\USER\Documents\project\linkfit-backend\dist\main.js이렇게 에러가 나서 보니까 main.js경로가 dist/src/main.js에 있던데 이게 맞나요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Relation 테이블 관련 에러
Movie, User 테이블하고 many-to-many 로 만든 Favorite 테이블이 있는데 Favorite 테이블에 저장하려고 할 때 이런 에러가 납니다.query failed: INSERT INTO `favorite`(`id`, `userId`, `movieId`) VALUES (DEFAULT, DEFAULT, DEFAULT) error: Error: Unknown column 'id' in 'field list' query: ROLLBACK [Nest] 782975 - 04/08/2023, 6:59:26 PM ERROR [ExceptionsHandler] Unknown column 'id' in 'field list' Movie 는 이렇게 만들어져있구요import { Entity, Column, PrimaryGeneratedColumn, ManyToMany, JoinTable } from 'typeorm'; import { User } from '../users/users.entity'; @Entity() export class Movie { @PrimaryGeneratedColumn() readonly id: number; @Column({ length: 100 }) title: string; @Column('text', { nullable: true }) desc: string; @ManyToMany(() => User, (user) => user.favorites) @JoinTable({ name: 'favorite' }) favorites: User[]; }User 는import { Entity, Column, PrimaryGeneratedColumn, ManyToMany, JoinTable } from 'typeorm'; import { Movie } from '../movies/movies.entity'; @Entity() export class User { @PrimaryGeneratedColumn() readonly id: number; @Column() username: string; @ManyToMany(() => Movie) @JoinTable({ name: 'favorite' }) favorites: Movie[]; }그리고 Favorite 은import { Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; import { User } from '../users/users.entity'; import { Movie } from '../movies/movies.entity'; @Entity() export class Favorite { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => User, (user) => user.favorites) user: User; @ManyToOne(() => Movie, (movie) => movie.favorites) movie: Movie; } 그런데 DB 를 보면 Favotie 테이블에 id 칼럼이 없습니다.그래서 favoriteRepository.save() 할때 에러가 난다고 의심하고 있는데요, favorites.service.ts는import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Favorite } from './favorites.entity'; @Injectable() export class FavoritesService { constructor( @InjectRepository(Favorite) private readonly favoriteRepository: Repository<Favorite>, ) {} async create(userId: number, movieId: number): Promise<Favorite> { const favorite = new Favorite(); favorite.user = { id: userId } as any; favorite.movie = { id: movieId } as any; return await this.favoriteRepository.save(favorite); } }이렇게 되어있습니다.어디를 고쳐야 하는걸까요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
일반적인 ORM 사용패턴(DDL, DML) 문의
수업에서는 기존 DB라 typeorm-model-generator를 사용했는데요,저의 질문의 요점은 ORM으로 DML 위주의 사용이 보편적인가 하는 것입니다.제가 python하다가 node.js로 넘어와서, python 예를 들어 죄송합니다만,https://velog.io/@youngkiu/SQLAlchemy-with-DDLpython에서는 model도 create table sql로 만들지 않고, model을 생성하고, ORM에서 DDL 처리도 같이 해주었습니다.스프링에서도 DDL은 ORM을 사용하지 않고, DB에서 직접 처리한다는 이야기를 듣기도 하여,업계에서 ORM의 일반적인 사용방법이 궁금하여 질문드립니다.늘 많이 배우고 있습니다. 감사합니다.타입스크립트 책 얼릉 출간해 주세요. 바로 구매하겠습니다.
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
httpException 에러 응답이 제대로 나오지 않습니다.
강의 내용 처럼 postman에서 에러 응답을 받고 싶습니다. 하지만 제대로된 에러 응답을 받지 못하고 있습니다.시도한 내용첫번째로, postman에서 post || localhost:3095/api/users 로 body에 아무런 내용없이 send를 보냈습니다.이후, 에러 응답으로 "msg":"이메일이 없네요."라는 답을 받았습니다. (성공) body에 이메일을 작성하여 send를 보냈지만,"msg":"이메일이 없네요."라는 이전과 동일한 에러응답을 받았습니다. (실패) 이메일을 send해도 "이메일이 없네요"라는 에러응답으로 답을 받고,다른 것으로 send를 해도 "이메일이 없네요"라고 에러응답을 받았습니다. 이를 해결하려고 하는데, 참고할만한 코드가 있을까요? users.service.ts@Injectable() export class UsersService { constructor( @InjectRepository(Users) private usersRepository: Repository<Users>, ) {} getUser() {} async join(email: string, nickname: string, password: string) { if (!email) { throw new HttpException('이메일이 없네요', 400); } if (!nickname) { throw new HttpException('닉네임이 없네요', 400); } if (!password) { throw new HttpException('비밀번호가 없네요.', 400); } const user = await this.usersRepository.findOne({ where: { email }}); if (user) { throw new HttpException('등록된 사용자입니다.', 401); } const hashedPassword = await bcrypt.hash(password, 12); await this.usersRepository.save({ email, nickname, password: hashedPassword, }); } } [계속 아래 이미지와 같은 에러 응답만 출력됩니다] 또한, 깃헙에서 코드를 참고하려했으나아래와 같이 진도가 달라서 어려웠습니다. ㅠㅠ 제로 초님께서 작성해주신 users.service.ts는 아래 코드 입니다.완성된 users.service.ts 내용인 것 같아서, 본 강의에 참고하기 어려워서 질문드렸습니다.@Injectable() export class UsersService { constructor( @InjectRepository(Users) private usersRepository: Repository<Users>, @InjectRepository(WorkspaceMembers) private workspaceMembersRepository: Repository<WorkspaceMembers>, @InjectRepository(ChannelMembers) private channelMembersRepository: Repository<ChannelMembers>, private dataSource: DataSource, ) {} async findByEmail(email: string) { return this.usersRepository.findOne({ where: { email }, select: ['id', 'email', 'password'], }); } async join(email: string, nickname: string, password: string) { const queryRunner = this.dataSource.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); const user = await queryRunner.manager .getRepository(Users) .findOne({ where: { email } }); if (user) { throw new ForbiddenException('이미 존재하는 사용자입니다'); } const hashedPassword = await bcrypt.hash(password, 12); try { const returned = await queryRunner.manager.getRepository(Users).save({ email, nickname, password: hashedPassword, }); const workspaceMember = queryRunner.manager .getRepository(WorkspaceMembers) .create(); workspaceMember.UserId = returned.id; workspaceMember.WorkspaceId = 1; await queryRunner.manager .getRepository(WorkspaceMembers) .save(workspaceMember); await queryRunner.manager.getRepository(ChannelMembers).save({ UserId: returned.id, ChannelId: 1, }); await queryRunner.commitTransaction(); return true; } catch (error) { console.error(error); await queryRunner.rollbackTransaction(); throw error; } finally { await queryRunner.release(); } } } 해결방법이 있을까요:?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
front, front-js, front-rq 폴더 질문
총 2개의 질문사항이 있습니다. GitHub에서 제공해주신 front폴더를 사용하려고 하는데, 아래와 같이 이름이 다른 front 폴더가 총 3개가 있습니다.front-jsfront-rqfront 질문1. 이 중, 어떤 폴더에서 npm run dev의 명령어를 입력해야 하는 것인지 궁금합니다. 질문2. front이름 뒤에 붙어있는 js와 rq의 의미가 궁금합니다!
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
데이터베이스 연결 싪패
DB연결 문제라고 해서, 처음부터 새로 생성해서 시도해보았으나, 에러 코드가 동일하게 출력됩니다ㅠㅠ ==============================시도해본 것들mysql 비밀번호 초기화, 재설정mysql db 다시 세팅dotenv 코드말고 직접 데이터베이스 정보 입력후 실행 터미널 메세지base) C:\Users\user\Downloads\master\a-nest> 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 C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\packets\packet.js:728 const err = new Error(message); ^ Error: Access denied for user ''@'localhost' (using password: YES) at Packet.asError (C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\packets\packet.js:728:17) at ClientHandshake.execute (C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\commands\command.js:29:26) at Connection.handlePacket (C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\connection.js:489:32) at PacketParser.onPacket (C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\connection.js:94:12) at PacketParser.executeStart (C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\packet_parser.js:75:16) at Socket.<anonymous> (C:\Users\user\Downloads\master\a-nest\node_modules\mysql2\lib\connection.js:101: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: YES)", sql: undefined. } app.module.ts@Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3307, autoLoadEntities: true, entities: [ ChannelChats, ChannelMembers, Channels, DMs, Mentions, Users, WorkspaceMembers, Workspaces, ], keepConnectionAlive: true, migrations: [__dirname + '/migrations/*.ts'], charset: 'utf8mb4_general_ci', synchronize: false, logging: true, }), TypeOrmModule.forFeature([Users]), UsersModule, WorkspacesModule, ChannelsModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer): void { consumer.apply(LoggerMiddleware).forRoutes('*'); // consumer.apply(FrontendMiddleware).forRoutes({ // path: '/**', // method: RequestMethod.ALL, // }); } }
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
webstorm과 vscode
강의에서는 webstorm이 사용되던데,vscode로 강의를 따라가는데 어려움이 없을까요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
socket.io 채팅이 안써져요(안보내져요)
socket.io가 프론트하고 백엔드하고 연결이 되었는지 궁금합니다.각각의 서버 구동은프론트는 inflearn/project/sleact/front 에서 npm run dev 로 실행하고 있고, 백엔드는 개인적인 폴더를 하나 파서 아래와 같이 서버를 npm run start:dev 로구동하고 있습니다.프론트 서버 : 3090백엔드서버 : 3095socket.io를 이용해서 채팅을 구현해보려 하는 도중 테스트 해보는데 채팅이 안보내집니다.아래의 사진과 같이 '123' 이라는 채팅을 치고 엔터를 누르면 그대로 있습니다.개발자 도구를 키고 Network탭 부분에 나온 스샷개발자도구 console.log 창 스샷백엔드 websocket.io 설치버전 프론트 웹소켓 설치버전
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
테이블 생성 관련 질문
1. 강의를 따라 하다 보면 중간 테이블의 이름이product_product_tags_product_tag라고 만들어지는데중간 테이블의 이름은 어떤 걸 기준으로, 어떤 규칙으로 만들어지는 건가요?2. 자동으로 생성된 중간 테이블의 이름을 임의로 변경해도 되나요?3. 지금 만들어진 테이블들은 저희가 만들어 놓은 entity 파일을 기준으로서버를 실행하면 TypeOrm 이 만들어 주는 게 맞는 거죠?
-
미해결따라하며 배우는 NestJS
async await 관련 질문입니다.
좋은 강의 영상 감사합니다. controller에서 service함수를 이용할때에는 async await 를 안써줘도 괜찮나요? 괜찮은것 같은데 혹시 그 이유는 무엇일까요..?