有没有办法将graphql查询字符串转换为GraphQLResolveInfo对象?
我编写了一个软件来解析和格式化graphql解析器函数(信息对象)的第四个参数,以便在别处使用。我想为这个软件编写单元测试。具体来说,我不想自己构建GraphQLResolveInfo
对象,因为这样做会非常麻烦,容易出错且难以维护。相反,我想编写人类可读的查询字符串并将它们转换为GraphQLResolveInfo
对象,以便我可以将它们传递给我的软件。
经过广泛的谷歌搜索和阅读graphql-js
源代码后,我还没有找到一种简单的方法来做他们在内部做的事情。我真的希望我错过了一些东西。
我不想做的是使用graphql-tag
库,因为它只生成一个AST,其格式与GraphQLResolveInfo
类型完全不同。
有没有人这样做过?非常感谢帮助!
回答如下:我将继续监控这个问题,看看是否有更好的答案,但我终于设法通过创建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
对象中那样。这绝不是完美的,将来可能会有所变化,具体取决于我的软件如何发展,但对于我的特定问题,这是一个相对简短的解决方案。
有没有办法将graphql查询字符串转换为GraphQLResolveInfo对象?
我编写了一个软件来解析和格式化graphql解析器函数(信息对象)的第四个参数,以便在别处使用。我想为这个软件编写单元测试。具体来说,我不想自己构建GraphQLResolveInfo
对象,因为这样做会非常麻烦,容易出错且难以维护。相反,我想编写人类可读的查询字符串并将它们转换为GraphQLResolveInfo
对象,以便我可以将它们传递给我的软件。
经过广泛的谷歌搜索和阅读graphql-js
源代码后,我还没有找到一种简单的方法来做他们在内部做的事情。我真的希望我错过了一些东西。
我不想做的是使用graphql-tag
库,因为它只生成一个AST,其格式与GraphQLResolveInfo
类型完全不同。
有没有人这样做过?非常感谢帮助!
回答如下:我将继续监控这个问题,看看是否有更好的答案,但我终于设法通过创建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
对象中那样。这绝不是完美的,将来可能会有所变化,具体取决于我的软件如何发展,但对于我的特定问题,这是一个相对简短的解决方案。