如何将 HotChocolate 中的模式打印为 GraphQL SDL

Posted

技术标签:

【中文标题】如何将 HotChocolate 中的模式打印为 GraphQL SDL【英文标题】:How can I print the schema in HotChocolate as GraphQL SDL 【发布时间】:2021-04-19 09:14:43 【问题描述】:

如果使用 Relay 进行开发,可以直接使用 Hot Chocolate GraphQL 服务器打印 GraphQL SDL。有没有办法做到这一点?

schema 
  query: Query


type Query 
  sayHello: String

【问题讨论】:

【参考方案1】:

Hot Chocolate Server 提供了将架构打印为 GraphQL SDL 的简单方法。

    您可以通过在ISchema 上调用ToString 来打印任何架构。

    这是一种更加程序化的方式,但在测试或控制台工具中打印模式非常有用。很高兴在这里知道任何语法节点都允许您以这种方式打印。所以,即使你想打印一个解析过的查询,你也可以对它执行ToString 来获取它的 GraphQL 语言字符串表示。

    对于像 Relay 这样的东西,让架构在端点上可用以下载它是非常有用的。 Hot Chocolate 服务器在所有版本中都提供了一个 GraphQL SDL 端点。

    版本 10 及更早版本:http://localhost:5000/graphql/schema

    版本 11 及更新版本:http://localhost:5000/graphql?sdl

    graphql 路由上托管 GraphQL 端点时,此 URL 应该是有效的。

【讨论】:

【参考方案2】:

如果您首先使用带有属性的代码来自动生成架构,这里有一个示例,说明如何获取架构实例并将其写入文件(如果它已更改)。

我将此代码放在 Program.cs 中,因此当我的 aspnet.core 项目在开发过程中启动时,它会自动为我的前端工具生成我的 schema.graphql 文件。

HostInstance = builder.Build();
if(Debugger.IsAttached)

    var resolver = HostInstance.Services.GetService<IRequestExecutorResolver>();
    if (resolver != null)
    
        var executor = resolver.GetRequestExecutorAsync().Result;
        if (executor != null)
        
            var schemaFile = Path.Combine(ProjectPathInfo.ProjectPath, "Apps\\src\\lib\\com\\GraphQL\\schema.graphql");
            var newSchema = executor.Schema.ToString();
            var oldSchema = File.ReadAllText(schemaFile);
            if (newSchema != oldSchema)
                File.WriteAllText(schemaFile, newSchema);
        
    


我使用这个支持内部类(借用自 here)来查找用于 SDL 输出的项目文件夹。

internal static class ProjectPathInfo

    public static string CSharpClassFileName = nameof(ProjectPathInfo) + ".cs";
    public static string CSharpClassPath;
    public static string ProjectPath;
    public static string SolutionPath;

    static ProjectPathInfo()
    
        CSharpClassPath = GetSourceFilePathName();
        ProjectPath = Directory.GetParent(CSharpClassPath)!.FullName;
        SolutionPath = Directory.GetParent(ProjectPath)!.FullName;
    

    private static string GetSourceFilePathName([CallerFilePath] string callerFilePath = null) => callerFilePath ?? "";

【讨论】:

以上是关于如何将 HotChocolate 中的模式打印为 GraphQL SDL的主要内容,如果未能解决你的问题,请参考以下文章

HotChocolate GraphQL 中的类型继承

如何在 GraphQL HotChocolate 中实现订阅?

Hot Chocolate:转换 [UseFiltering] 查询的结果

如何在 Resolver 中拦截 GraphQL Hotchocolate Banana Cake Pop 查询

GraphQL HotChoclate 中的接口 - 模式首先出现异常

没有模态的打印页面[重复]