Бросить HttpException в функцию nest Js asyn c - PullRequest
0 голосов
/ 30 мая 2020

Я новичок в nest Js, однако моя недавняя проблема, которую я собираюсь описать, больше связана с обработкой исключений asyn c. У меня есть функция http post, которая отвечает за вставку пользователя в mongodb в случае, если не удается найти другого пользователя с этим идентификатором. Поскольку функция findOne является asyn c, я не могу генерировать исключение, когда существует повторяющийся пользователь. вот мой контроллер:

  @Post('/register')
    async register(@Body() createUserDto: User): Promise<String> {
       return await this.sejamService.registerUser(createUserDto);

    }

my userService:

  try {
                this.findOne(userProfile.nationalCode).then(res => {
                    if (res === undefined) {
                        var user = new User(userProfile.nationalCode, userProfile.email, userProfile.password, userProfile.firstName,
                            userProfile.surname, userProfile.fatherName, userProfile.birthCertNumber, userProfile.phoneNumber);
                        //const createdUser = new this.userModel(userProfile);
                        this.usersRepository.save(user);
                    } else {
                        throw new HttpException({
                    status: HttpStatus.BAD_REQUEST,
                    error: 'some error',
                }, HttpStatus.CONFLICT);
                    }

                });
            } catch (e) {
                console.log('error');
                throw new HttpException({
                    status: HttpStatus.BAD_REQUEST,
                    error: 'some error',
                }, HttpStatus.CONFLICT);
            }

1 Ответ

1 голос
/ 30 мая 2020

Поскольку я не могу протестировать этот код, я попытаюсь набросать возможное решение.

Во-первых, я начну с того, что, на мой взгляд, выбрасывает http исключений изнутри. services - не лучшая практика, так как в идеале службы не должны знать об этом контексте. Конечно, есть исключения, ваше не похоже на одно из них (опять же - это мое мнение).

Что касается самого «решения», вы можете воспользоваться преимуществами Promise s, например:

userService (это всего лишь фрагмент кода):

return new Promise((resolve, reject) => {
    this.findOne(userProfile.nationalCode).then(() => {
    if (res === undefined) {
        const user = new User(userProfile.nationalCode, userProfile.email, userProfile.password, userProfile.firstName,
                    userProfile.surname, userProfile.fatherName, userProfile.birthCertNumber, userProfile.phoneNumber);
        //const createdUser = new this.userModel(userProfile);
        this.usersRepository.save(user);
        resolve();
    } else {
        reject('some error');
    }
})
   ...

Имея этот код в руке, вы можете сделать что-то вроде этого в своем контроллере:

@Post('/register')
async register(@Body() createUserDto: User): Promise<String> {
  try {
     await this.sejamService.registerUser(createUserDto);
  } catch(e) {
     throw new HttpException(....)
  }
}

Опять же, приведенный выше код является просто примером. Делайте все, что вам нужно, чтобы сделать его более подходящим.

...