使用 grapiql 的 GraphQl 变量 - 变量未定义

Posted

技术标签:

【中文标题】使用 grapiql 的 GraphQl 变量 - 变量未定义【英文标题】:GraphQl variable using grapiql - variable is undefined 【发布时间】:2019-06-15 00:51:41 【问题描述】:

我正在使用这个端点:

 @PostMapping("graphql")
    public ResponseEntity<Object> getResource(@RequestBody Object query)  // String query
        ExecutionResult result;
        if (query instanceof String) 
            result = graphQL.execute(query.toString()); // if plain text
         else
            String queryString = ((HashMap) query).get("query").toString();
            Object variables = ((HashMap) query).get("variables");
            ExecutionInput input = ExecutionInput.newExecutionInput()
                    .query(queryString)
                    .variables((Map<String, Object>) variables) // "var1" -> "test1"
                    .build();

            result = graphQL.execute(input);
        
        return new ResponseEntity<Object>(result, HttpStatus.OK);
    

当我没有变量时它工作正常:

query 
    getItem(dictionaryType: "test1") 
        code
        name
        description
    

当我添加 variable 时它开始失败,请参见此处:

query 
    getItem(dictionaryType: $var1) 
        code
        name
        description
    

在我的schema 中,我定义了query 部分如下:

type Query 
    getItem(dictionaryType: String): TestEntity

java 代码中:

@Value("classpath:test.graphqls")
private Resource schemaResource;
private GraphQL graphQL;

@PostConstruct
private void loadSchema() throws IOException 
        File schemaFile = schemaResource.getFile();
        TypeDefinitionRegistry registry = new SchemaParser().parse(schemaFile);
        RuntimeWiring wiring = buildWiring();
        GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, wiring);
        graphQL = GraphQL.newGraphQL(schema).build();



private RuntimeWiring buildWiring() 
        initializeFetchers();
        return RuntimeWiring.newRuntimeWiring()
                .type("Query", typeWriting -> typeWriting
                        .dataFetcher("getItem", dictionaryItemFetcher)

                )
                .build();


private void initializeFetchers() 
        dictionaryItemFetcher = dataFetchingEnvironment ->
                dictionaryService.getDictionaryItemsFirstAsString(dataFetchingEnvironment.getArgument("dictionaryType"));

【问题讨论】:

请更新您的问题。这些图像应该被删除并替换为您正在尝试的查询的文本以及您收到的错误。这将帮助遇到相同错误的其他人找到此问题,并且如果您发布的图像被删除,它将防止出现问题。 Daniel - 以后可以随意建议编辑 - 我很乐意接受。我使用了堆栈溢出上可用的选项-仅此而已。我稍后会编辑问题。 【参考方案1】:

操作中使用的任何变量都必须声明为操作定义的一部分,如下所示:

query OptionalButRecommendedQueryName ($var1: String) 
  getItem(dictionaryType: $var1) 
    code
    name
    description
  

这使 GraphQL 可以根据提供的类型验证您的变量,并验证变量是否正在用于代替正确的输入。

【讨论】:

以上是关于使用 grapiql 的 GraphQl 变量 - 变量未定义的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:variableValues 中的意外变量:首先在 args 中不使用变量时

如何在 GraphQL 查询变量中使用数组

使用 GraphQL 变量和 Next JS 过滤数组中的数据

使用变量时的 GraphQL 错误请求

使用数组作为 GraphQL 查询的变量

引用 Gatsby 模板中查询中使用的 GraphQL 变量?