You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:25:03