<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 其他功能 在GraphQL世界中,很多文章抱怨如何處理諸如身份驗證或操作的副作用之類的東西。我們應該把它放在業務邏輯中嗎?我們是否應該使用更高階的函數來增強查詢和變更,例如,使用授權邏輯?或者也許使用[模式指令](https://www.apollographql.com/docs/apollo-server/v2/features/directives.html)。無論如何,沒有一個答案。 Nest生態系統正試圖利用[守衛](/8/guards)和[攔截器](/8/interceptors)等現有功能幫助解決這個問題。它們背后的想法是減少冗余,并為您提供有助于創建結構良好,可讀且一致的應用程序的工具。 ### 概述 您可以以與簡單的 REST 應用程序相同的方式使用[守衛](/8/guards)、[攔截器](/8/interceptors)、[過濾器](/8/exceptionfilters)或[管道](/8/pipes)。此外,您還可以通過利用[自定義裝飾器](/8/customdecorators) 特性輕松地創建自己的 decorator。他們都一樣。讓我們看看下面的代碼: ```typescript @Query('author') @UseGuards(AuthGuard) async getAuthor(@Args('id', ParseIntPipe) id: number) { return await this.authorsService.findOneById(id); } ``` 正如您所看到的,GraphQL在看守器和管道方面都能很好地工作。因此,您可以將身份驗證邏輯移至守衛,甚至可以復用與 REST 應用程序相同的守衛。攔截器的工作方式完全相同: ```typescript @Mutation() @UseInterceptors(EventsInterceptor) async upvotePost(@Args('postId') postId: number) { return await this.postsService.upvoteById({ id: postId }); } ``` ### 執行上下文 但是,ExecutionContext 看守器和攔截器所接收的情況有所不同。GraphQL 解析器有一個單獨的參數集,分別為 root,args,context,和 info。因此,我們需要將 ExecutionContext 轉換為 GqlExecutionContext,這非常簡單。 ```typescript import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { GqlExecutionContext } from '@nestjs/graphql'; @Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const ctx = GqlExecutionContext.create(context); return true; } } ``` GqlExecutionContext 為每個參數公開相應的函數,比如 getArgs(),getContext()等等。現在,我們可以毫不費力地獲取特定于當前處理的請求的每個參數。 ### 異常過濾器 該[異常過濾器](/8/exceptionfilters)與 GraphQL 應用程序兼容。 ```typescript @Catch(HttpException) export class HttpExceptionFilter implements GqlExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const gqlHost = GqlArgumentsHost.create(host); return exception; } } ``` > GqlExceptionFilter 和 GqlArgumentsHost 需要import @nestjs/graphql 包。 但是,`response` 在這種情況下,您無法訪問本機對象(如在HTTP應用程序中)。 ### 自定義裝飾器 如前所述,[自定義裝飾器](/8/customdecorators)功能也可以像 GraphQL 解析器一樣工作。但是,Factory 函數采用一組參數而不是 `request` 對象。 ``` export const User = createParamDecorator( (data: unknown, ctx: ExecutionContext) => GqlExecutionContext.create(ctx).getContext().user, ); ``` 然后: ```typescript @Mutation() async upvotePost( @User() user: UserEntity, @Args('postId') postId: number, ) {} ``` > 在上面的示例中,我們假設您的user對象已分配給GraphQL應用程序的上下文。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看