首页 > 解决方案 > 在nestJs异步函数中抛出HttpException

问题描述

我是nestJs的新手,但是我最近要详细说明的问题更多的是异步异常处理问题。我有一个 http post 函数,它负责在 mongodb 中插入一个用户,以防找不到具有该 ID 的任何其他用户。由于 findOne 函数是异步的,因此当存在重复用户时我不能抛出异常。这是我的控制器:

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

    }

我的用户服务:

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

标签: javascriptnestjs

解决方案


由于我无法测试此代码,我将尝试绘制一个可能的解决方案。

首先,我将首先说明,在我看来,http从服务中抛出异常并不是最佳实践,因为理想情况下,服务不应该知道该上下文。显然有例外,你的似乎不是其中之一(再次 - 这是我的观点)。

至于“解决方案”本身,您可以利用Promises,例如:

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(....)
  }
}

同样,上面的代码只是一个示例。做任何你需要做的事情来让它更合适。


推荐阅读