📜  GraphQL-验证(1)

📅  最后修改于: 2023-12-03 15:15:25.545000             🧑  作者: Mango

GraphQL 验证

GraphQL 是一种强类型查询语言,它可以允许客户端指定他们需要的数据。GraphQL 可以让您从多个数据源获取数据,并在一个 API 调用中返回所需的所有数据。 在GraphQL中,默认情况下没有输入验证。这意味着您需要手动验证所有输入以避免潜在的错误,这可能是一项繁琐的任务。在本文中,我们将探讨如何在GraphQL中验证输入以确保他们的正确性以及如何声明自己的验证规则。

使用 GraphQL 自带指令来验证

GraphQL 自身提供了一些指令来简化输入验证的过程。以下指令适用于输入参数:

  • @deprecated: 标记一个字段或一个参数已过时。
  • @include: 可以根据某些条件选择性地包括查询中的某些字段。
  • @skip:可以根据某些条件选择性地跳过查询中的某些字段。

例如,如果您要验证一个需要字符串类型的名称参数,则可以使用 @constraint 指令:

input UserInput {
  name: String! @constraint(minLength: 3, maxLength: 50, pattern: "^[a-zA-Z]+([a-zA-Z0-9_]+)?$")
}

在上面的示例中,我们使用了 @constraint 指令来确保名称至少包含3个字符,至多包含50个字符,并且只包含字母,数字和下划线。同样的,你也可以应用 @constraint 指令到其他需要输入值的类型上。

自己声明规则验证

如果您想要更具定制化的验证方法,可以自定义验证器并将其绑定到您的解析器类型上。GraphQL 提供了一个验证器接口 IGraphQLValidator,您可以实现这个接口来声明自己的验证规则。 在验证器中,您可以访问输入字段的名称,值和类型,并编写您自己的验证逻辑。

interface IGraphQLValidator {
  validate(type: GraphQLObjectType, fieldName: string, inputArg: any, info: GraphQLResolveInfo): Array<ValidationError> | Promise<Array<ValidationError>>;
}

上面的代码段中,validate 方法包含四个参数。第一个参数是类型,可以是 GraphQLObjectType、GraphQLInputObjectType 或 GraphQLInterfaceType,第二个参数是要验证的字段的名称,第三个参数是要验证的输入参数,最后一个参数是 GraphQLResolveInfo,其中包含了有关请求的上下文信息。

以下是一个简单的例子:

import { IGraphQLValidator, ValidationError } from 'graphql-validator';

export class ExampleValidator implements IGraphQLValidator {
  validate(type, fieldName, inputArg) {
    const errors = [];
    if (inputArg.someProperty !== 'someValue') {
      errors.push(new ValidationError('someProperty', 'Expected someProperty to be \'someValue\''));
    }
    return errors.length > 0 ? errors : null;
  }
}

在上面的示例中,我们实现了 IGraphQLValidator 接口,并在 validate 方法中编写了自己的验证逻辑。这个验证逻辑只检查了输入参数中的一个属性是否等于某个值,并返回一个自定义的“ValidationError”,包含了属性名称和错误信息。

您可以在每个需要自定义验证的解析器中,将 ExampleValidator 类作为 resolver 类型的验证器。下面是一个简单的例子:

const mySchema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: {
      exampleField: {
        type: GraphQLString,
        args: {
          someProperty: { type: GraphQLString }
        },
        resolve: (_, args, context) => {
          return "Hello World!";
        },
		validate: new ExampleValidator()
      }
    }
  })
});

上面的示例中,我们将 ExampleValidator 类作为 exampleField 的验证器,并将其传递给 validate 字段。在这个场景中,每次调用 exampleField 都会触发 ExampleValidator 中的 validate 方法,并执行自定义验证逻辑。

结论

在GraphQL中使用验证非常重要,以确保输入的数据正确无误。我们可以使用GraphQL自带的验证指令来处理简单的验证要求,也可以自定义验证器,访问GraphQL上下文并声明自己的确切验证规则。我们希望这篇文章对您有所帮助,并祝您在GraphQL中验证愉快!