## 其他功能
在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應用程序的上下文。
- 介紹
- 概述
- 第一步
- 控制器
- 提供者
- 模塊
- 中間件
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 自定義裝飾器
- 基礎知識
- 自定義提供者
- 異步提供者
- 動態模塊
- 注入作用域
- 循環依賴
- 模塊參考
- 懶加載模塊
- 應用上下文
- 生命周期事件
- 跨平臺
- 測試
- 技術
- 數據庫
- Mongo
- 配置
- 驗證
- 緩存
- 序列化
- 版本控制
- 定時任務
- 隊列
- 日志
- Cookies
- 事件
- 壓縮
- 文件上傳
- 流式處理文件
- HTTP模塊
- Session(會話)
- MVC
- 性能(Fastify)
- 服務器端事件發送
- 安全
- 認證(Authentication)
- 授權(Authorization)
- 加密和散列
- Helmet
- CORS(跨域請求)
- CSRF保護
- 限速
- GraphQL
- 快速開始
- 解析器(resolvers)
- 變更(Mutations)
- 訂閱(Subscriptions)
- 標量(Scalars)
- 指令(directives)
- 接口(Interfaces)
- 聯合類型
- 枚舉(Enums)
- 字段中間件
- 映射類型
- 插件
- 復雜性
- 擴展
- CLI插件
- 生成SDL
- 其他功能
- 聯合服務
- 遷移指南
- Websocket
- 網關
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 適配器
- 微服務
- 概述
- Redis
- MQTT
- NATS
- RabbitMQ
- Kafka
- gRPC
- 自定義傳輸器
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 獨立應用
- Cli
- 概述
- 工作空間
- 庫
- 用法
- 腳本
- Openapi
- 介紹
- 類型和參數
- 操作
- 安全
- 映射類型
- 裝飾器
- CLI插件
- 其他特性
- 遷移指南
- 秘籍
- CRUD 生成器
- 熱重載
- MikroORM
- TypeORM
- Mongoose
- 序列化
- 路由模塊
- Swagger
- 健康檢查
- CQRS
- 文檔
- Prisma
- 靜態服務
- Nest Commander
- 問答
- Serverless
- HTTP 適配器
- 全局路由前綴
- 混合應用
- HTTPS 和多服務器
- 請求生命周期
- 常見錯誤
- 實例
- 遷移指南
- 發現
- 誰在使用Nest?