Graphql:完全更改架构中的字段类型

时间:2018-06-25 19:07:38

标签: graphql apollo graphql-js apollo-server graphql-tools

我需要完全更改字段类型。

情况:我有一个结合了多种服务的网关。它通过内省获取其模式,通过将名称空间添加到类型(使用apollo graphql-tools)并将其放置在嵌套查询(例如Query: { ServiceName: { serviceQuery } })中来转换它们,方法是使用ServiceNameQuery类型构建新模式并设置{ {1}}个解析器。之后,我需要创建跨服务链接。

我有一个delegate,其类型为属性ServiceA,其中包含来自related的{​​{1}}的ID。我需要将属性TargetType的类型从ServiceB更改为related,并添加一个解析程序,该解析程序将从ID中获取数据。

这是一个真实的例子: enter image description here

为此,我在合并的架构上运行TargetType(来自ServiceB转换),找到我需要的字段,从架构中获取visitSchema并更改字段类型并设置一个解析器,例如这个:

graphql-tools

当我运行console.log并将其传递给graphql服务器之前,在结果模式上键入类型-我看到它的类型和astNode确实发生了变化,并且它们是正确的。

运行自省功能时,我发现该类型的字段是正确的。

但是当我运行类似TargetType的查询时,在请求解析阶段会出错:

const targetType = schema.getType('TargetType');
field.type = targetType;
field.astNode.type = targetType.astNode;
field.resolve = (parent, args, ctx, info) => {
    console.log(parent);
    return null;
  };

该事件不会尝试调用query { ServiceA { serviceQuery { id related { id } } } }解析器。

当我更改类型定义时,它在哪里获得此字段的ID类型?我还需要在哪里更改它的类型?

UPD 即使我创建这样的新类型:

Error: Field "related" must not have a selection since type "ID" has no subfields.

GraphQL request (5:19)
4:       id
5:       related {
                     ^
6:         id

    at asErrorInstance (/.../node_modules/graphql/execution/execute.js:555:43)
    at process._tickCallback (internal/process/next_tick.js:68:7)

我一直收到此错误,并且未触发解析器。如果我以相同的方式添加一个具有不同名称的新字段,则可以。但是,如果名称相同-错误

1 个答案:

答案 0 :(得分:1)

好,我知道了。缝合模式会跟踪基础缝合模式。在顶级架构上更改类型不会对其造成影响,因此会导致内部类型冲突。因此,应在合并之前更改类型