自定义标量 + 声明式输入校验器模式
超越简单的 String/Int 类型,教你创建带有内置业务校验的自定义标量(如 Email、PhoneNumber、ColorHex),并在解析输入时自动验证,无需在 Resolver 中写 if-else。 · 难度:入门 · +10XP
自定义标量 + 声明式输入校验器模式
GraphQL 允许定义自定义标量,但多数教程只停留在序列化/反序列化。本课深入如何为自定义标量附加校验逻辑,例如:scalar Email @specifiedBy(url: "https://tools.ietf.org/html/rfc5321"),同时在解析器中使用正则或第三方库校验。更进一步,我们将展示如何建立一个可复用的 Validator 类,在 parseValue 和 parseLiteral 中抛出 GraphQLError,并附带友好的错误消息。同时结合 @constraint 指令完成声明式校验。
const EmailScalar = new GraphQLScalarType({
name: 'Email',
description: 'A valid email address',
serialize: (v) => v,
parseValue: (v) => {
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) {
throw new GraphQLError('Invalid email format');
}
return v;
},
parseLiteral: (ast) => {
if (ast.kind !== Kind.STRING) throw new GraphQLError('Email must be string');
return EmailScalar.parseValue(ast.value);
},
});