Logo
Section 1 / 2

验证 GraphQL 查询

了解 GraphQL 服务器如何验证客户端的查询。

导入

验证 GraphQL 查询

了解 GraphQL 服务器如何验证客户端的查询。

通过利用类型系统,我们可以在不依赖运行时检查的情况下,让服务器和客户端在开发者发送 GraphQL 查询时判断其有效性。

无法展开片段(Fragment)

片段不能引用自身,因为这可能导致无限递归的结果。以下是在 pizzas 查询中使用了无效 GraphQL 片段的示例:

1query GetPizzas { 2 Neapolitan: pizzas(name: "Neapolitan Pizza") { 3 ...pizzaFields 4 } 5 Chicago: pizzas(name: "Chicago Pizza") { 6 ...pizzaFields 7 } 8} 9 10fragment pizzaFields on Pizza { 11 ... on Pizza { 12 id 13 pizza 14 } 15 ... on ChicagoPizza { 16 ...pizzaFields // 此处无效! 17 } 18}

如果我们执行该查询,将收到如下错误:

1{ 2 "errors": [ 3 { 4 "message": "Maximum call stack size exceeded", 5 "extensions": { 6 "code": "INTERNAL_SERVER_ERROR", 7 // 堆栈跟踪信息 8 } 9 } 10 ] 11}

无法查询字段

当我们查询字段时,必须查询该类型所包含的字段。如果 Pizza 查询返回的是 Pizza 类型,我们就只能查询 Pizza 类型中存在的字段。由于该类型没有 dough 字段,因此以下查询是无效的。

1// 无效:Pizza 类型中不存在 dough 字段 2 3query{ 4 pizzas { 5 __typename 6 ... on Pizza { 7 id 8 toppings { 9 id 10 topping 11 } 12 status 13 pizza 14 dough // 此处无效! 15 } 16 } 17}

如果我们执行该查询,将收到如下错误:

1{ 2 "errors": [ 3 { 4 "message": "Cannot query field \"dough\" on type \"Pizza\".", 5 // 错误详情 6 } 7 ] 8}

未选择子字段

当我们查询一个字段,且其返回值不是标量(scalar)或枚举(enum)类型时,必须明确指定希望返回的具体子字段。Pizzas 查询返回的是 VariousPizza 类型,它可以是 Pizza、ChicagoPizza 或 DominoPizza,而每种类型都包含 toppings 字段。只要我们在查询中使用了 toppings 字段,就必须指定其内部需要查询的字段,否则将报错。

1query{ 2 pizzas { 3 __typename 4 ... on Pizza { 5 id 6 toppings // 此处无效! 7 status 8 pizza 9 } 10 } 11}

如果我们执行该查询,将收到如下错误:

1{ 2 "errors": [ 3 { 4 "message": "Field \"toppings\" of type \"Pizza\" must have a selection of subfields. Did you mean \"toppings { ... }\"?", 5 "locations": [ 6 { 7 "line": 6, 8 "column": 7 9 } 10 ] 11 } 12 ] 13}

测试 GraphQL 查询

请在 GraphQL Playground 中测试上述无效查询。

模式与类型

GraphQL 查询验证测验