如何在GraphQL Yoga中结合使用GraphQL Modules与Directives?
如何在GraphQL Modules中结合Schema Directives使用GraphQL Yoga
你有两种可行的方案来实现需求,以下是具体说明:
方案一:在GraphQL Modules内部集成指令(推荐)
GraphQL Modules本身支持在模块层面定义和处理Schema指令,无需额外取出整个Schema修改,能更好地维持模块化结构。
示例代码:
// 定义指令的处理逻辑 const MyDirective = { field(fieldConfig) { const originalResolve = fieldConfig.resolve; // 给字段添加指令对应的自定义逻辑 fieldConfig.resolve = async (source, args, context, info) => { console.log("触发@myDirective指令逻辑"); return originalResolve?.(source, args, context, info); }; return fieldConfig; }, }; // 在模块中注册指令并使用 const MyModule = createModule({ id: "my-module", typeDefs: /* GraphQL */ ` directive @myDirective on FIELD_DEFINITION type Query { hello: String @myDirective } `, resolvers: { Query: { hello: () => "Hello World", }, }, // 将指令与模块绑定 schemaDirectives: { myDirective: MyDirective, }, }); // 创建应用并集成模块 const application = createApplication({ modules: [MyModule] }); // 正常创建Yoga服务器,无需额外修改 const yoga = createYoga<ServerContext>({ plugins: [useGraphQLModules(application)], });
方案二:取出Schema修补后配置Yoga
如果必须使用外部工具修补Schema,也可以从Modules应用中取出原始Schema,修补后再传入Yoga。但需要注意同步Modules的上下文和解析器逻辑,避免丢失功能。
示例代码:
import { transformSchema } from "@graphql-tools/schema"; // 从Modules应用获取原始Schema let schema = application.schema; // 修补Schema,应用指令逻辑 schema = transformSchema(schema, { transformField(fieldConfig, fieldName, typeName) { // 检查字段是否带有目标指令 const hasMyDirective = fieldConfig.astNode?.directives?.some( d => d.name.value === "myDirective" ); if (hasMyDirective) { const originalResolve = fieldConfig.resolve; fieldConfig.resolve = async (source, args, context, info) => { console.log("触发修补后的@myDirective指令逻辑"); return originalResolve?.(source, args, context, info); }; } return fieldConfig; }, }); // 使用修补后的Schema创建Yoga,同时复用Modules的上下文工厂 const yoga = createYoga<ServerContext>({ schema, context: application.createContext, });
总结
优先选择方案一,因为它符合GraphQL Modules的模块化设计理念,无需额外拆解Schema,维护性更强。方案二仅适用于必须使用外部工具处理Schema的特殊场景。
内容的提问来源于stack exchange,提问作者Alexander Charkov
相关产品推荐
相关产品推荐

