@kokapuk

Как правильно отловить ошибку Mongodb?

Делаю систему логинов и регистрации по логину. Хочу отлавливать ошибку при создании пользователя, поскольку в поле login стоит unique: true, и при попытке создать пользователя с логином, который уже используется, в консоль вылазит большой ерор, который говорит про дубликат, а свервер возвращает internal error.
@Schema()
export class User {
  @Prop({ unique: true })
  login: string;

  @Prop()
  password: string;
}

async create(dto: CreateUserDto): Promise<User> {
    const createdUser = new this.userModel(dto);
    return createdUser.save();
  }

{
    "statusCode": 500,
    "message": "Internal server error"
}

Пытался сделать это в service и controller, не помогло:
async create(dto: CreateUserDto): Promise<User> {
    try {
      const createdUser = new this.userModel(dto);
      return createdUser.save();
    } catch {
      throw new HttpException(
        'User with this login already exist',
        HttpStatus.CONFLICT,
      );
    }
  }
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@Sky6blue
try {
      const createdUser = new this.userModel(dto);
     /* return createdUser.save(); */  // <<<<<<< вот здесь проблемное место, у тебя ошибка происходит во время
       // того как ты уже уже вышел из этого кода и catch не может отработать
       // так как save() возвращает промис, а ты ее не дожидаешься, а сразу ретёрнишь
      // то этот промис авэитится выше nest'ом и там он выкидывает 500 код
      // замени это строчку, и все отловится в нижнем catch
      // вот так
      const doc = await createdUser.save();
      return doc;
    } catch {
      throw new HttpException(
        'User with this login already exist',
        HttpStatus.CONFLICT,
      );
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Grapeoff
@Grapeoff
В чём концепция...?
Ещё более коротко

try {
      return await this.userModel.create(dto);
    } catch {
      throw new HttpException(
        'User with this login already exist',
        HttpStatus.CONFLICT,
      );
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы