【问题标题】:Creating a GraphQLObjectType with an indexable field signature?创建具有可索引字段签名的 GraphQLObjectType?
【发布时间】:2017-06-22 17:49:42
【问题描述】:

我目前正在将 REST API 转换为 GraphQL,但我在其中一个端点中遇到了一些障碍。

目前,此端点返回一个对象,其键可以是无限的字符串集,并且其值都匹配某个形状。

所以,作为一个初步的例子,我有这种情况......

// response
{
    foo: { id: 'foo', count: 3 },
    bar: { id: 'bar', count: 6 },
    baz: { id: 'baz', count: 1 },
}

同样,密钥在运行时是未知的,可以是无限的字符串集。

例如,在 TypeScript 中,这种情况是通过使用可索引字段签名创建接口来处理的,就像这样......

interface Data {
    id: string;
    count: number;
}

interface Response {
    [key: string]: Data;
}

所以,我的问题是:graphql 可以做这种事情吗?我将如何为此创建类型/模式?

提前致谢!

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    我认为一种解决方案可以是使用JSON.stringify() 方法

    exampleQuery: {
        type: GraphQLString,
        resolve: (root, args, context) => {
            let obj = {
                foo: { id: 'foo', count: 3 },
                bar: { id: 'bar', count: 6 },
                baz: { id: 'baz', count: 1 }
            };
    
            return JSON.stringify(obj);
        }
    }
    

    然后,在检索到 GraphQL 查询的结果后,您可以使用 JSON.parse(result)(如果执行查询的部分也是用 JavaScript 编写的 - 否则您将不得不使用其他语言的等效方法来解析传入的 JSON回应)。

    这种解决方案的缺点是您无法选择要从查询中检索的obj 的哪些字段,但是,正如您所说,返回的对象可以有无限的字符串集,这些字符串可能是在应用程序的前端不知道,所以不需要选择它的键,对吗?

    【讨论】:

    • 感谢您的反馈。抱歉耽搁了!我最终为一条特定的路线使用了类似的东西,但最终也只是将类似的响应转换为类型的解析方法中的数组。换句话说...resolve: myObj => Object.keys(myObj).map(key => ({ key, value: myObj[key] }));
    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2017-10-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多