javascript - 在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);
}
解决方案
由于我无法测试此代码,我将尝试绘制一个可能的解决方案。
首先,我将首先说明,在我看来,http
从服务中抛出异常并不是最佳实践,因为理想情况下,服务不应该知道该上下文。显然有例外,你的似乎不是其中之一(再次 - 这是我的观点)。
至于“解决方案”本身,您可以利用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(....)
}
}
同样,上面的代码只是一个示例。做任何你需要做的事情来让它更合适。