인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

Exception Filter

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

해결된 질문

작성

·

527

·

수정됨

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

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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

 

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를 적용하는게 동시에 에러메시지가 나올 것 같네요.

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

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

{

"이메일이 없네요."

"비밀번호가 없네요."

"닉네임이 없네요"
}

 

Exception Fliter강의에서 처럼

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

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

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

 

 

이미지 참조(강의화면)

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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


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

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

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

 

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

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

 

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

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

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

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

 

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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

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


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

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기