簡體   English   中英

如何正確使用帶有 Nestjs 的 Observables?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM