• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

httpException 에러 응답이 제대로 나오지 않습니다.

23.03.24 12:31 작성 23.04.05 15:22 수정 조회수 418

0

강의 내용 처럼 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();
    }
  }
}

 

해결방법이 있을까요:?

답변 1

답변을 작성해보세요.

0

콘솔 스텝이라는 게 뭔가요? 어떤 동작이 수행되길 원하시는 건가요?

June님의 프로필

June

2023.03.24

 

HttpException을 테스트해보고 싶어

아래 코드를 작성하였습니다.

그런데, 첫번째 에러문구인 '이메일이 없네요'는 출력되는데, 두번째 에러문구인 '닉네임이 없네요'는 실행되지 않고 있습니다ㅠㅠ

다음의 내용이 순서대로 수행되길 희망합니다!

 

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);
    }

당연히 수행될 수가 없습니다. throw는 return처럼 함수를 중단합니다. 이메일이 없다는 게 나오면 거기서 함수가 종료됩니다. dto에 class-validator를 적용하는게 동시에 에러메시지가 나올 것 같네요.

June님의 프로필

June

2023.03.25

질문에 오해가 있었습니다.

아래처럼 동시에 에러코드를 한번에 보고자 하는게 아니였습니다.

{

"이메일이 없네요."

"비밀번호가 없네요."

"닉네임이 없네요"
}

 

Exception Fliter강의에서 처럼

아무것도 입력하지 않으면 "이메일이 없네요"

이메일만 입력해있으면"비밀번호가 없네요"

이메일+비밀번호가 입력되어있으면 "닉네임이 없네요"라는 것을 출력하고 싶었습니다!

 

 

이미지 참조(강의화면)

 

아직도 질문이 이해가 되지 않습니다. 저 코드가 있으면 그렇게 에러메시지가 나오는 거 아닌가요? 지금 저 코드를 썼음에도 안 나온다고 질문을 주신건가요? 왜 정상 작동하는 코드가 있는데 질문을 주시는건지를 모르겠습니다.


제대로 작동하지 않는거라면 user.services join에서 email password nickname이 제대로 전달된것인지는 확인해보셨나요?

June님의 프로필

June

2023.03.25

질문 내용을 보다 자세하게 수정했습니다!

아직 nest 공부량이 적다보니, 질문이 많이 서툰 것 같습니다. 죄송합니다.

 

네! 제로초님께서 말씀해주신대로

저 코드를 썼음에도 에러응답이 나오지 않습니다.

 

즉, 강의 내용과 똑같이 코드를 썼음에도 정상 작동하지 않았습니다.

그래서 GitHub에서 해당 코드를 참고하려 확인했으나

본 강의 내용의 코드는 없어서 조언을 얻고자 질문을 드린 것입니다.

user.service join은 제대로 되었습니다.

 

 

똑같이 썼다, 제대로 됐다라고 하지마시고 직접 보여주세요. console.log(email, password, nickname)을 넣은 코드랑 그 결과도 보여주세요.

June님의 프로필

June

2023.04.04

제가 질문드린 것을 다시 읽어보니, typeorm과 nestjs을 제대로 공부하지 않은 것 같아, typeorm과 nestjs 공식문서를 정독한 후 다시 처음부터 강의 듣고 해결했습니다!!
또한 postman에서 row옵션을 json으로 변경도 안했더라구요😱😱😱바보같네요


제로초님 덕분에 typeorm0.3.x 강의를 모국어로 학습할 수 있다는 것에 다시한번 감사드립니다ㅠㅠ