

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 GraphQL 配置运行复杂度、查询深度和内省 AWS AppSync
<a name="configuration-limits"></a>

AWS AppSync 允许您启用或禁用内省功能，并对单个查询中嵌套关卡和解析器的数量设置限制。

## 使用自省特征
<a name="configuration-limits-introspection"></a>

**提示**  
有关 GraphQL 中的自省的更多信息，请参阅 [GraphQL 基金会网站](https://graphql.org/learn/introspection/)上的这篇文章。

默认情况下，GraphQL 允许您使用自省来查询架构本身，以发现其类型、字段、查询、突变、订阅等。这是一项用于了解 GraphQL 服务如何塑造和处理数据的重要特征。然而，在处理自省时，有一些事情需要考虑。您可能有一个用例，该用例受益于禁用自省，例如字段名称可能是敏感的或隐藏的，或者不为使用者记录整个 API 架构。在这些情况下，通过自省发布架构数据可能会导致泄露特意保密的数据。

为了防止这种情况发生，您可以禁用自省。这将防止未经授权的各方在您的架构上使用自省字段。但值得注意的是，自省对于开发团队了解其服务中数据的处理方式非常有用。在内部将自省保持为启用状态，而在生产代码中将其禁用，这可能会有所帮助，可作为一层额外的安全措施。处理这个问题的另一种方法是添加一种授权方法，该方法 AWS AppSync 还提供了。有关更多信息，请参阅 [ 授权](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html)。

AWS AppSync 允许您在 API 级别启用或禁用内省。要启用或禁用自省，请执行以下操作：

1. 登录 AWS 管理控制台 并打开[AppSync控制台](https://console.aws.amazon.com/appsync/)。

1. 在该**APIs**页面上，选择 GraphQL API 的名称。

1. 在您的 API 主页的导航窗格中，选择**设置**。

1. 在 **API 配置**中，选择**编辑**。

1. 在**自省查询**下，执行以下操作：

   1. 开启或关闭**启用自省查询**。

1. 选择**保存**。

启用自省（默认行为）后，自省系统将正常工作。例如，下图显示了一个处理架构中所有可用类型的 `__schema` 字段：

![\[GraphQL schema explorer showing query structure with types and name fields.\]](http://docs.aws.amazon.com/zh_cn/appsync/latest/devguide/images/introspection-enabled.png)


禁用此特征时，响应中将出现验证错误：

![\[GraphQL query editor showing a validation error for undefined 'types' field in '_Schema'.\]](http://docs.aws.amazon.com/zh_cn/appsync/latest/devguide/images/introspection-disabled.png)


## 配置查询深度限制
<a name="configuration-limits-depth"></a>

有时您可能需要更精细地控制 API 在操作期间的运行方式。一个此类控制措施是对查询可以处理的嵌套级别数量添加限制。默认情况下，查询能够处理不限数量的嵌套级别。将查询限制为指定数量的嵌套级别可能会影响项目的性能和灵活性。执行以下查询：

```
query MyQuery {
  L1: nextLayer {
    L2: nextLayer {
      L3: nextLayer {
        L4: value
      }
    }
  }
}
```

您的项目可能出于某种目的而要求将查询限制为 `L1` 或 `L2`。默认情况下，从 `L1` 到 `L4` 的整个查询都将在无法控制的情况下进行处理。通过设置限制，可以防止查询访问超过指定级别的任何内容。

要添加查询深度限制，请执行以下操作：

1. 登录 AWS 管理控制台 并打开[AppSync控制台](https://console.aws.amazon.com/appsync/)。

1. 在该**APIs**页面上，选择 GraphQL API 的名称。

1. 在您的 API 主页的导航窗格中，选择**设置**。

1. 在 **API 配置**中，选择**编辑**。

1. 在**查询深度**下，执行以下操作：

   1. 开启或关闭**启用查询深度**。

   1. 在**最大深度**中，设置深度限制。可以介于 `1` 和 `75` 之间。

1. 选择**保存**。

设置限制后，超过其上限将导致 `QueryDepthLimitReached` 错误。例如，下图显示了一个查询，其深度限制 `2` 超过第三级 (`L3`) 和第四级 (`L4`) 的限制：

![\[Query structure with nested layers L1, L2, L3, and L4, showing depth limit exceeded.\]](http://docs.aws.amazon.com/zh_cn/appsync/latest/devguide/images/query-depth-limit.jpg)


请注意，在架构中，字段仍然可以标记为可为 null 或不可为 null。如果不可为 null 的字段收到 `QueryDepthLimitReached` 错误，则会对第一个可为 null 的父字段引发该错误。

## 配置解析器计数限制
<a name="configuration-limits-resolver-count"></a>

您还可以控制每个查询可以处理多少个解析器。与查询深度一样，您可以为此数量设置限制。采用以下包含三个解析器的查询：

```
query MyQuery {
  resolver1: resolver
  resolver2: resolver
  resolver3: resolver
}
```

默认情况下，每个查询最多可以处理 10000 个解析器。在上面的示例中，将处理 `resolver1`、`resolver2` 和 `resolver3`。但是，您的项目可能需要将每个查询限制为总共处理一个或两个解析器。通过设置限制，您可以告诉查询不要处理任何超过特定数量的解析器，比如第一个 (`resolver1`) 或第二个 (`resolver2`) 解析器。

要添加解析器计数限制，请执行以下操作：

1. 登录 AWS 管理控制台 并打开[AppSync控制台](https://console.aws.amazon.com/appsync/)。

1. 在该**APIs**页面上，选择 GraphQL API 的名称。

1. 在您的 API 主页的导航窗格中，选择**设置**。

1. 在 **API 配置**中，选择**编辑**。

1. 在**解析器计数限制**下，执行以下操作：

   1. 开启**启用解析器计数**。

   1. 在**最大解析器数量**中，设置计数限制。可以介于 `1` 和 `10000` 之间。

1. 选择**保存**。

与查询深度限制一样，超过配置的解析器限制会导致查询在其它解析器上结束并出现 `ResolverExecutionLimitReached` 错误。在下图中，解析器计数限制为 *2* 的查询尝试处理三个解析器。由于限制，第三个解析器会引发错误并且不会运行。

![\[Query with three resolvers, showing error on third resolver due to execution limit reached.\]](http://docs.aws.amazon.com/zh_cn/appsync/latest/devguide/images/resolver-count-limit.jpg)
