728x90
반응형

1. 문제

ban.entity.ts를 새로 만들어서 데이터베이스에 추가하려 했으나 에러문구 발생

 

[Nest] ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)... 
TypeORMError: Entity metadata for User#bans was not found. 
Check if you specified a correct entity object and 
if it's connected in the connection options.

 

2. 시도해본 것들

엔티티..메타데이터..not found.. 자주봤던 것 같다.

일단 entity를 만들고, .env에 있는 DATABASE_SYNC=true로 만들면 자동으로 동기화가 될 거라 생각했다.

 

3. 해결과정

그러나!! 이 모든 것이 진행되는 config의 typeorm.config.service.ts에서 Ban 엔티티를 추가해줘야한다.

@Injectable()
export class TypeOrmConfigService implements TypeOrmOptionsFactory {
  constructor(private readonly configService: ConfigService) {} //필수

  createTypeOrmOptions(): TypeOrmModuleOptions {
    return {
      type: 'mysql',
      host: this.configService.get<string>('DATABASE_HOST'),
      port: this.configService.get<number>('DATABASE_PORT'),
      username: this.configService.get<string>('DATABASE_USERNAME'),
      password: this.configService.get<string>('DATABASE_PASSWORD'),
      database: this.configService.get<string>('DATABASE_NAME'),
      namingStrategy: new SnakeNamingStrategy(),
      logging: Boolean(this.configService.get<string>('DATABASE_logging')),
      synchronize: Boolean(this.configService.get<string>('DATABASE_SYNC')), // 배포 시 false
      entities: [
        Collection,
        CollectionItem,
        Comment,
        CommentLike,
        CommentUserTag,
        Post,
        Hashtag,
        Image,
        PostLike,
        PostUserTag,
        Restaurant,
        User,
        Follow,
        Reports,
        Ban,
      ],
    };
  }
}

 

4. 알게 된 점

엔티티 작성, DATABASE_SYNC=true 뿐만아니라 config에서

entities에도 엔티티가 추가됬음을 알려줘야 한다.

728x90
반응형
728x90
반응형

1. 문제

맛집리스트 생성시 처음에는 이름만 데이터로 받고 생성하려함. (수정시에는 다른 정보도 선택적 수용)

그런데 네임만 입력하니 다른것도 입력하라는 문구가 발생

 

2. 시도해본 것들

  @IsString()
  readonly type?: 'myList';

위와 같이 type? 로 모두 적어줬으나 계속 같은 에러 발생

{
  "success": false,
  "timestamp": "2023. 3. 13. 오전 10:28:58",
  "statusCode": 400,
  "message": [
    "type must be a string",
    "description must be a string",
    "image must be a string",
    "visibility must be a string"
  ],
  "error": "Bad Request"
}

 

3. 해결과정

GPT에게 연속적으로 질문했다.

처음에는 ?를 붙이라 했고 말해준대로 해도 안된다하니,

main.ts 파일에서 다음과 같이 app.useGlobalPipes()를 적용하라해서 이미 있는거라고 하니

  @IsString()
  @IsOptional()
  readonly type?: 'myList';

@IsOptional까지 넣으라고 답변해주었고 실행하니 정상적용되었다.

 

4. 알게 된 점

물음표만 붙이면 모두 옵셔널이 되는줄 알았는데,

옵셔널 데코레이터가 있다는걸 알게되었다. 앞으로도 자주 쓸 것 같은 지식!

728x90
반응형
728x90
반응형

1. 문제

더보기

ERROR [WsExcepionsHandler] Chatting validation failed: nickname: 

Cast to Embedded failed for value "닉네임" (type string)

at path "nickname" because of "ObjectExpectedError"

오늘 2번이나 나를 괴롭게 했던 에러문구! (더보기 클릭)

몽구스 model 관련 에러였다.

 

2. 시도해본 것들

오늘은 채팅하면서 닉네임과 채팅내용을 가져오는 작업을 했다.

강의를 보면서 코드를 완성했다.

그런데 채팅메시지가 null로 들어가서

이것저것 손보다가 에러 문구를 봤다. 

 

[validation failed]

 

검색해보면서 model관련 에러인것을 알았고,

유효성 실패?? 대충 단어를 보고 어디에 문제가 있는지 떠올려야 했다.

메시지의 경우는 model에선 chat이라 쓰고, gateway에선 message라고 쓰는 등

중구난방으로 사용했길래 통일해서 해결완료.

 

닉네임 값도 저장하고 싶은데 계속 null이 뜨거나

다음과 같이 에러문구가 발생했다.

 

3. 해결과정

    await this.chattingModel.create({
      nickname: client.data.nickname,
      message,
    });

 위의 코드를 계속 수정해가며 테스트했다.

nickname : socketObj

nickname : socketObj.id 등 계속하다가

도저히 알수가 없어서

튜터님을 찾아가서 해결했다.

 

@Schema(options)
export class Chatting extends Document {


  // @Prop({
  //   type: {
  //     _id: { type: Types.ObjectId, required: false, ref: 'sockets' },
  //     id: { type: String },
  //     username: { type: String, required: false },
  //   },
  // })
  @Prop({ required: true })
  @IsString()
  @IsNotEmpty()
  nickname: string;
  // nickname: SocketModel;

  @Prop({
    required: false,
  })
  @IsNotEmpty()
  @IsString()
  message: string;
}

export const ChattingSchema = SchemaFactory.createForClass(Chatting);

 

주석으로 처리한 prop(속성)값을 강의에서 본대로 작성했는데

type쪽이 유형을 정해버려서 에러가 발생했다.

그전에도 required: true; 에서 문제가 발생했다.

테스트하는 과정이라 닉네임도 없고 id도 없다보니

없는 변수를 필수로 처리해서 에러가 발생한것이었다.

 

 

4. 알게 된 점

 

몽고디비, 몽구스 연결시도 10회를 채우기로 했다.

도대체 뭐가 문제인지 궁금했다. 상세메시지를 봐야 해결할 수 있지 않을까?

상세 에러문구

강의보고 따라 작성한 옵션이고, 나는 최신몽구스를 설치한 것 같은데

해당 옵션은 지원하지 않는다고 한다. 주석처리하니 문제가 해결되었다.

[validation failed] 이것은 몽구스 model관련 에러니까 prop(속성)을 자세히 살펴보자!

 

728x90
반응형
728x90
반응형

1. 문제

[mongoosemodule] unable to connect to the database

강의와 문서들을 보며 몽구스를 연결시도했다.

그런데 서버실행만 하면 계속 위와 같은 문구가 발생하여 나를 괴롭혔다......ㅠㅠ

수차례 여러가지를 시도 했는데 안되니까 멘붕

 

2. 시도해본 것들

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ChatBackEndModule } from './chatBackEnd/chatBackEnd.module';
import { ChatFrontEndModule } from './chatFrontEnd/chatFrontEnd.module';
import { TypeOrmConfigService } from './common/config/typeorm.config.service';
import * as mongoose from 'mongoose'; //몽구스
import { LoggerMiddleware } from './logger/logger.middleware'; //미완성 로그 => 강의를 중구난방으로 들어서 찾기 어려움

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    //몽구스 연결 process.env.MONGO_URL
    MongooseModule.forRoot(process.env.MONGO_URL, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      // useCreateIndex: true,
      // useFindAndModify: false,
    }),

    TypeOrmModule.forRootAsync({
      useClass: TypeOrmConfigService,
    }),
    ChatBackEndModule,
    ChatFrontEndModule,
  ],
})
//몽구스 추가설정
export class AppModule implements NestModule {
  private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
    mongoose.set('debug', this.isDev);
  }
}

app.module.ts의 구성이었다.

시도해본 것은 환경설정값 대신 직접 입력하거나,

ConfigModule의 순서를 바꾸거나

useNewParser을 주석처리하거나 온갖 해결방법을 찾아서 다 시도해봤지만 실패했다.

 

3. 해결과정

 

방법을 찾던 도중 스택오버플로우에서 다음과 같은 글귀를 봤다

https://stackoverflow.com/questions/70730514/unable-to-connect-to-the-database-retrying

데이터 연결하면 Retrying(3)... (4)...

이렇게 뜨는데 상세한 에러 문구가 없어서 뭐 어쩌라고! 라는 심정이었다

그런데 10번만 기다리면 상세문구를 준다고?

 

4. 알게 된 점

 

몽고디비, 몽구스 연결시도 10회를 채우기로 했다.

도대체 뭐가 문제인지 궁금했다. 상세메시지를 봐야 해결할 수 있지 않을까?

상세 에러문구

강의보고 따라 작성한 옵션이고, 나는 최신몽구스를 설치한 것 같은데

해당 옵션은 지원하지 않는다고 한다. 주석처리하니 문제가 해결되었다.

 

역시 에러코드가 자세히 나와야 문제를 해결할 수 있다.

몽구스가 10회 시도후 에러문구를 발생시킨다는것을 잊지말자.

728x90
반응형
728x90
반응형

1. 문제

./adapters/socket-io.adapters' 모듈 또는 해당 형식 선언을 찾을 수 없습니다

nestjs에서 소켓을 공부하고 있던 중

다른 완성된 파일을 받아서 따라 치고 있었다.

그런데 위와 같은 문구가 발생하면서 안된다ㅠㅠ

 

2. 시도해본 것들

구글에 폭풍검색하고, gpt에게도 물어봤는데 해당 방법대로 해도 되지 않는다.

GPT도 패키지를 설치해야 한다는데 사실 깔려있는데 계속 되지 않았다.

그러던 중 해당 파일을 퍼온 블로그를 다시 확인했다.

그냥 패키지에서 가져온 것이 아니라 커스텀해야 했기에 특정경로에 파일을 만들었어야 했다.

 

3. 해결과정

 

모듈 또는 형식을 찾을 수 없습니다 => 패키지 설치를 잘못했다

라는 생각이 박혀있었다. 하지만 그게 아니라 경로의 문제일 수 있다.

import { SocketIoAdapter } from './adapters/socket-io.adapters';

여기서 from뒤에 빨간줄이 그어지면 그 폴더와 파일이 없다는 것이다.

 

4. 알게 된 점

 

모듈 또는 형식을 찾을 수 없습니다

라는 문구가 뜬다면 2가지를 확인하자!

 

첫 번째, 패키지를 잘 설치했는가? (json파일을 보자)

두 번째, 해당 경로가 존재하는가?

728x90
반응형
728x90
반응형

1. 문제

Table [테이블명] doesn't exist ??

 

npx sequelize init

npx sequelize db:create

npx sequelize model:generate --name User --attributes nickname:string,password:string,confirm:string

 

모두 작성했고, 회원가입 로직까지 만들어서 post를 보내는데 계속 에러가 난다.

근데 로직은 맞는 것 같은데 db도 생성했는데 왜 안될까ㅠㅠㅠㅠ

 

2. 시도해본 것들

 

구글에 검색해봤다. 테이블이 없을때 발생하는 에러래요~

뭐야 이 뻔한 얘기는.. 영어로 테이블 없다고 써져있잖......어??

 

3. 해결과정

 

npx sequelize db:migrate

생각해보니 이걸 안했네.....

 

 

4. 알게 된 점?

 

 

npx sequelize init

npx sequelize db:create

npx sequelize model:generate --name User --attributes nickname:string,password:string,confirm:string

 

3가지를 하고나면 생성된 모델과 마이그레이션을 수정하느라

npx sequelize db:migrate 를 까먹게 된다ㅠㅠ

 

모델 생성하면 다음것도 꼭 해야하는데생성된걸 수정하다보면 까먹는다..... 다음엔 잊지말아야지!

728x90
반응형
728x90
반응형

1) map()이란 무엇인가

모든 배열의 아이템에 function을 실행하는 메서드다.
그리고 함수의 결과 값으로 새로운 배열을 만든다.

const days = ["Mon", "Tue", "Wed", "Thurs", "Fri"];
//함수 자체를 변수에 할당하여 쓰거나
const addNumber = (day, index) => `#${index+1} 😍${day}`;
const smilingDays = days.map(addNumber);

// 또는 함수를 직접 넣어 사용
// const smilingDays = days.map((day, index) => `#${index+1} 😍${day}`);
console.log(smilingDays)

 

2) 콜백함수란 무엇인가

 

정의 : 함수에 파라미터로 들어가는 함수
용도 : 순차적으로 실행하고 싶을 때 씀
참고 : 콜백함수가 필요한 함수들에만 콜백함수 사용가능

          잘만들어진 함수를 협업하는 팀원이 가져다 쓰고 싶을 때 사용

          콜백함수로 함수를 디자인하지 말고, Promise도 있고 async, await도 있음.

 

document.querySelector("button").addEventListener("click", 콜백함수)
// 버튼을 클릭했을 때, 이 함수가 실행되게 해주세요.
function first(파라미터){
    console.log(1)
    파라미터()
}
function seconde(){
    console.log(2)
}

// 순차적으로 실행하기 위해 함수의 파라미터에 다른 함수를 넣음(콜백함수)
first(second)

 

3) jwt이란 무엇인가? (+ 세션,토큰 차이점)

로그인 기능을 구현할때
1. session : 정보가 간단하게 담김 => db확인하느라 처리시간이 김
2. token(jwt방식) : 정보가 많이 담김 => 정보 보고 바로 통과
둘 중 하나 이용하여 구현함

단점 : 디코딩이 쉬움, 시크릿키를 쉽게하면 털림, 남의 jwt 탈취 => 리프레쉬토크

별일 없으면 역사와 전통의 session 방식이 좋다.
그러나 많은 데이터를 처리해야한다면 jwt를 써야하는데 보안에 신경써야 한다.


쿠키: 서버와 사용자간에 주고 받는 데이터(웹에는 있지만, 앱에는 없음)

세션: 중요한 정보는 모두 서버->DB에 담겨 있음. 유저가 가진 것은 세션ID뿐

토큰: 서버가 기억하는 이상하게 생긴 문자열(ID카드)
JWT:  정보를 갖고 있는 토큰(DB없이 검증가능)
       토큰형식. DB를 생성하지 않음. 토큰을 받으면 '사인된 정보'를 유저에게 보냄
       토큰이 유효한지만 검사하고, 암호화하진 않음(비밀번호를 담으면 안됨)

세션장점 :  모든 정보를 저장. 해당 정보를 이용해 새로운 기능을 추가가능.
               예를 들어 세션을 삭제하고 쫓아낼 수 있음(ex.넷플리스)
JWT장점 :  토큰을 추적하지 않음. 토큰 유효성만 검사함. 하지만 강제로그아웃 등 하지 못함.

 

=> 규모가 작을때는 JWT를 추천하지만, 규모가 커진다면 세션을 쓰는게 좋은 편


4) 미들웨어란 무엇인가

미들웨어의 정의: 양쪽을 연결해서 데이터를 주고 받을 수 있도록 중간에서 매개 역활을 하는 소프트웨어

 

[어플리케이션 레벨] app.use(+get post put 등)의 메서드로 미들웨어를 등록할 수 있음.
[라우터 레벨] router.use는 인스턴스에 바인딩된다는 점을 제외하면 어플리케이션의 레벨과 동일하게 작동한다.
[오류처리 미들웨어] (err, req, res, next) 꼭 4개의 인수를 사용해야 한다. 하나라도 생략되면 일반 미들웨어로 인식한다.

[타사 미들웨어] 제 3자가 만든 미들웨어 (body-parser, morgan 등)
[내장 미들웨어] Express가 내장한 미들웨어들을 뜻한다

내장 미들웨어

 

5)  라우팅이란? (+app.use란 무엇인가)


라우팅은 응용 프로그램이 URI(또는 경로) 및 특정 HTTP 요청 메서드(GET, POST 등)인 특정 끝점에 대한

클라이언트 요청에 응답하는 방법을 결정하는 것을 말합니다.

appHTTP 메서드에 해당하는 Express 개체의 메서드를 사용하여 라우팅을 정의합니다 . 

예를 들어 app.get()GET 요청을 처리하고 app.postPOST 요청을 처리합니다.

app.use()를 사용하여 미들웨어를 콜백 함수로 지정할 수 있습니다

 

=> 콜백함수 정의 : 함수에 파라미터로 들어가는 함수 / 용도 : 순차적으로 실행하고 싶을 때 씀

 

응답 방법

 

 

 

 

728x90
반응형
728x90
반응형

회원가입 프로젝트를 만드는 도중, 

post를 사용시에 해당 에러 발견

 

테이블이 없다고? 무슨소리지.. Users라는 것을 찾아봐야겠다!

 

 

models 폴더에서 tableName을 추가했어야 했다. 추가하니까 성공적으로 정보를 전달할 수 있었다.

728x90
반응형

+ Recent posts