在 GraphQL 对象查询中使用变量

Posted

技术标签:

【中文标题】在 GraphQL 对象查询中使用变量【英文标题】:Using variables in GraphQL object query 【发布时间】:2018-06-28 22:43:00 【问题描述】:

我正在研究GraphQL JS tutorial 并试图了解变量如何与查询一起使用。

在Object Types section 我可以正常工作:

我的server.js 文件:

const express = require('express')
const graphqlHTTP = require('express-graphql')
const  buildSchema  = require('graphql')

const app = express()

const schema = buildSchema(`
  type RandomDie 
    numSides: Int!
    rollOnce: Int!
    roll(numRolls: Int!): [Int]
  

  type Query 
    getDie(numSides: Int): RandomDie
  
`)

class RandomDie 
  constructor(numSides) 
    this.numSides = numSides;
  

  rollOnce() 
    return 1 + Math.floor(Math.random() * this.numSides);
  

  roll(numRolls) 
    var output = [];
    for (var i = 0; i < numRolls; i++) 
      output.push(this.rollOnce());
    
    return output;
  

const root = 
  getDie: (numSides) => 
    return new RandomDie(numSides || 6);
  ,


module.exports = root

app.use('/graphql', graphqlHTTP(
  schema: schema,
  rootValue: root,
  graphiql: true,
))

app.listen(4000)

console.log('Running a GraphQL API server at localhost:4000/graphql')

我的random.json 文件:


  "query": "query RollDice($sides: Int)  getDie(numSides: $sides)  rollOnce roll(numRolls: 3) ",
  "variables": 
    "sides": 6
  

如果我在这里运行这个命令:

http http://localhost:4000/graphql < ./random.json

我得到这个输出:


  "data": 
    "getDie": 
      "roll": [
        1,
        6,
        2
      ],
      "rollOnce": 5
    
  

我的问题是:

如何将 numRolls3 设置为 random.json 文件中的变量?

我试过这个:


  "query": "query RollDice($sides: Int, $rolls: Int)  getDie(numSides: $sides)  rollOnce roll(numRolls: $rolls) ",
  "variables": 
    "sides": 6,
    "rolls": 3
  

但是得到了这个错误:

"message": "Variable \"$rolls\" of type \"Int\" used in position expecting type \"Int!\"."

【问题讨论】:

您缺少 Int query RollDice($sides: Int!, $rolls: Int!) 后面的感叹号 宾果游戏!你是对的@JohannesMerz ...但是,我在没有设置$sides: Int! 的情况下进行了测试...我将其保留为$sides: Int,它仍然有效。为什么!$rolls 是必需的,而不是$sides 【参考方案1】:

定义变量时,变量类型必须与它们要替换的输入类型匹配完全匹配。虽然您的 $rolls 变量和 numRolls 输入类型都是整数,但您已将 rolls 定义为可为空的整数 (Int),而在您的架构中,您已将输入定义为“非 Null”整数 (Int !)

type RandomDie 
  roll(numRolls: Int!): [Int]


type Query 
  getDie(numSides: Int): RandomDie

注意numSides 只是IntnumRolls 被定义为Int!,这就是$sides 不需要! 的原因(实际上使$sides 成为@987654331 @ 也会抛出错误!)

Non-null 是一个包装器,它告诉 GraphQL 输入不能为空(对于输入类型)或返回的字段不能为空(对于数据类型)。要记住的是,从 GraphQL 的角度来看,非空包装器会将其包装的类型转换为不同的类型,因此 Int !== Int!

【讨论】:

以上是关于在 GraphQL 对象查询中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL:用于查询返回不同类型对象的模式?

我们如何从 GraphQL 的 RequestContextHolder 获取 GraphQL 的 HttpServletRequest(DefaultGlobalContext)(使用 graphq

GraphQL,使用 GraphiQL 的查询语法不正确

在 graphQL 中提交对象数组作为查询变量

带有官方 Graphql 教程的“无法在 CreateUser 类型上查询字段 'id'”

当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?