在解析器中检测参数类型

时间:2018-07-14 10:36:27

标签: graphql graphql-js graphiql graphql-tools

在解析器中,我需要检测参数的类型。我可以有一个由多个输入类型组成的深层嵌套参数对象。像这样:

# where is of type DocumentWhereInput 
# and nested objects in OR operator are DocumentWhereInput types too
documents(where: {OR: [{id_gt: 0}, {id_not: 1}]}, first: 2) {
    id
  }
}

我尝试使用TypeInfo:

const typeInfo = new TypeInfo(info.schema);
const filteredSelections = visit(info.operation, { 
  leave: (node, key, parent, path, ancestors) => typeInfo.leave(node),
  enter: (node, key, parent, path, ancestors) => {
    typeInfo.enter(node);
    const type = typeInfo.getInputType();
}});

但这是

  1. 匹配操作中的所有输入,不仅匹配给定的解析器(虽然可以过滤)
  2. 不适用于变量,仅适用于内联参数

我可以使用graphiql中的函数来获取变量类型,如下所示:

export function collectVariables(schema, operationDefinition) {
  const variableToType = Object.create(null);
  const variableDefinitions = operationDefinition.variableDefinitions;
  if (variableDefinitions) {
    variableDefinitions.forEach(({variable, type}) => {
      const inputType = typeFromAST(schema, type);
      if (inputType) {
        variableToType[variable.name.value] = inputType;
      }
    });
  }
  return variableToType;
}
collectVariables(info.schema, info.operation)

但这仅提供变量的类型,而不是子类型。

所以

Resolver函数将args接受为带有内联参数和变量的扩展对象。如何检测此args组成的类型?还是整个操作,但包括变量?这是可能的,graphql在验证中内部执行,graphiql也执行,但是我不知道怎么做。

例如在开始时查询,我想要这样的东西:

{ where: DocumentWhereInput { OR: [ DocumentWhereInput, DocumentWhereInput ] }, first: Int }

或任何其他将类型映射到值的结构

0 个答案:

没有答案