[英]How to properly use Observables with nestjs?
我正在研究一個 API,它可以處理用戶(為了簡單起見)做基本的 crud 操作。 我得到了類似的用戶服務:
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) { }
...
async findById(id: number): Promise<User> {
return this.usersRepository.findOne(id);
}
和 controller:
@UseGuards(JwtAuthGuard)
@UseInterceptors(ClassSerializerInterceptor)
@UseFilters(QueryFailedExceptionFilter)
@Controller('users')
export class UsersController {
constructor(private readonly _userService: UsersService) { }
@Get(':id')
findById(@Param('id', ParseIntPipe) id: number): Observable<User> {
return from(this._userService.findById(id));
}
這很有效,我可以找到、創建、刪除等。問題是,如果我嘗試 finOne 用戶(我的 controller 中的 Get(:id) ),如果它不存在,它只會返回 200 ok 而沒有響應到客戶端,但它應該是 404,因為找不到資源。
閱讀我理解的文檔(希望我做對了),我們可以返回一個 observable 並且它會被自動訂閱。 所以問題是,如果 findOne 的結果是空的,在哪里以及如何處理,並返回一個具有適當狀態的響應,當然使用 observables。
我試圖找到一些例子,但我只找到了幾個使用 promises 的例子,而且大多數時候他們只是忽略了 not find 用戶案例。
PD:“他們”說我應該在 controller 中處理這個問題
如果你想返回 404 並使用 observables,你可以這樣做:
@UseGuards(JwtAuthGuard)
@UseInterceptors(ClassSerializerInterceptor)
@UseFilters(QueryFailedExceptionFilter)
@Controller('users')
export class UsersController {
constructor(private readonly _userService: UsersService) { }
@Get(':id')
findById(@Param('id', ParseIntPipe) id: number): Observable<User> {
return from(this._userService.findById(id)).pipe(
map(user => {
if (!user) {
throw new NotFoundException();
}
return user;
})
);
}
我個人很喜歡將我的所有邏輯都保留在服務中而不是控制器中,從而使控制器保持纖薄,並且大部分邏輯可重用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.