📅  最后修改于: 2023-12-03 15:15:25.545000             🧑  作者: Mango
GraphQL 是一种强类型查询语言,它可以允许客户端指定他们需要的数据。GraphQL 可以让您从多个数据源获取数据,并在一个 API 调用中返回所需的所有数据。 在GraphQL中,默认情况下没有输入验证。这意味着您需要手动验证所有输入以避免潜在的错误,这可能是一项繁琐的任务。在本文中,我们将探讨如何在GraphQL中验证输入以确保他们的正确性以及如何声明自己的验证规则。
GraphQL 自身提供了一些指令来简化输入验证的过程。以下指令适用于输入参数:
例如,如果您要验证一个需要字符串类型的名称参数,则可以使用 @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中验证愉快!