작성자 없음
작성자 정보가 삭제된 글입니다.
해결된 질문
작성
·
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
당연히 수행될 수가 없습니다. 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 강의를 모국어로 학습할 수 있다는 것에 다시한번 감사드립니다ㅠㅠ
HttpException을 테스트해보고 싶어
아래 코드를 작성하였습니다.
그런데, 첫번째 에러문구인 '이메일이 없네요'는 출력되는데, 두번째 에러문구인 '닉네임이 없네요'는 실행되지 않고 있습니다ㅠㅠ
다음의 내용이 순서대로 수행되길 희망합니다!