指令驱动开发:用自定义Schema Directive重构业务逻辑层
深入GraphQL指令原理,从指令定义、参数校验到用@compute、@authorize等自定义指令替代Resolver中的重复业务代码,实现声明式逻辑编排。 · 难度:入门 · +10XP
指令驱动开发:用自定义Schema Directive重构业务逻辑层
GraphQL指令(Directive)通常被用于客户端查询控制,但服务端自定义指令能将权限校验、数据转换、缓存策略等横切关注点从Resolver中剥离。本教程从指令的生命周期(visitFieldDefinition/visitSchema)入手,演示如何通过graphql-tools的SchemaDirectiveVisitor创建可复用的业务指令:比如@compute(fields: ["price", "qty"] -> "total")自动计算冗余字段,@authorize(role: "admin")在字段层级合并权限决策。最终你会理解如何通过5条指令替换整个Resolver层80%的样板代码。
class ComputeDirective extends SchemaDirectiveVisitor {
visitFieldDefinition(field) {
const { fields, target } = this.args
const originalResolve = field.resolve
field.resolve = async (source, args, ctx, info) => {
const computed = fields.reduce((acc, f) => acc * (source[f] ?? 0), 1)
return computed
}
}
}