在nestJs异步函数中抛出HttpException

Eli*_*i m 0 javascript nestjs

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

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

    }
Run Code Online (Sandbox Code Playgroud)

我的用户服务:

  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);
            }
Run Code Online (Sandbox Code Playgroud)

Mor*_*osh 6

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

首先,我首先声明,在我看来,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');
    }
})
   ...
Run Code Online (Sandbox Code Playgroud)

有了该代码,您就可以在控制器中执行以下操作:

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

再次强调,上面的代码只是一个示例。做任何你需要做的事情,让它更合适。