【问题标题】:Is there a way to convert a graphql query string into a GraphQLResolveInfo object?有没有办法将 graphql 查询字符串转换为 GraphQLResolveInfo 对象?
【发布时间】:2019-04-18 16:53:21
【问题描述】:

我编写了一个软件来解析和格式化 graphql 解析器函数(信息对象)的第四个参数,以便在其他地方使用。我想为这个软件编写单元测试。具体来说,我不想自己构建GraphQLResolveInfo 对象,因为这样做会非常麻烦、容易出错并且难以维护。相反,我想编写人类可读的查询字符串并将它们转换为 GraphQLResolveInfo 对象,以便我可以将它们传递给我的软件。

在大量搜索和阅读graphql-js 源代码之后,我还没有找到一种简单的方法来完成他们在内部所做的事情。我真的希望我错过了什么。

我不想做的是使用graphql-tag 库,因为这只会生成一个格式与GraphQLResolveInfo 类型非常不同的AST。

以前有人做过吗?非常感谢您的帮助!

【问题讨论】:

    标签: node.js graphql


    【解决方案1】:

    我将继续关注这个问题,看看是否会出现更好的答案,但我终于设法解决了我的特定问题,方法是根据我的特定用例的需要创建GraphQLResolveInfo 对象的近似值。

    GraphQLResolveInfo 对象由几个属性组成,其中两个分别称为fieldNodes 和fragments。两者实际上都是 graphql-tag 从查询字符串生成的同一个 AST 的一部分。这些是GraphQLResolveInfo 对象中与我编写的软件有关的唯一部分,其余部分被忽略。

    这就是我所做的:

    import gql from 'graphql-tag';
    
    // The converter function
    const convertQueryToResolveInfo = (query) => {
        const operation = query.definitions
            .find(({ kind }) => kind === 'OperationDefinition');
        const fragments = query.definitions
            .filter(({ kind }) => kind === 'FragmentDefinition')
            .reduce((result, current) => ({
                ...result,
                [current.name.value]: current,
            }), {});
    
        return {
            fieldNodes: operation.selectionSet.selections,
            fragments,
        };
    };
    
    // An example call
    const query = gql`
        query {
            foo {
                bar
            }
        }
    `;
    const info = convertQueryToResolveInfo(query);
    

    从graphql-tag 生成的AST 中,我提取并修改操作和片段定义,使它们看起来与GraphQLResolveInfo 对象中的方式相同。这绝不是完美的,将来可能会根据我的软件的发展方式发生变化,但它是针对我的特定问题的相对简短的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2023-01-30
      • 2020-02-08
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多