在 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
我的问题是:
如何将 numRolls
的 3
设置为 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!\"."
【问题讨论】:
您缺少 Intquery 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
只是Int
而numRolls
被定义为Int!
,这就是$sides
不需要!
的原因(实际上使$sides
成为@987654331 @ 也会抛出错误!)
Non-null 是一个包装器,它告诉 GraphQL 输入不能为空(对于输入类型)或返回的字段不能为空(对于数据类型)。要记住的是,从 GraphQL 的角度来看,非空包装器会将其包装的类型转换为不同的类型,因此 Int
!== Int!
。
【讨论】:
以上是关于在 GraphQL 对象查询中使用变量的主要内容,如果未能解决你的问题,请参考以下文章
Apollo GraphQL:用于查询返回不同类型对象的模式?
我们如何从 GraphQL 的 RequestContextHolder 获取 GraphQL 的 HttpServletRequest(DefaultGlobalContext)(使用 graphq
带有官方 Graphql 教程的“无法在 CreateUser 类型上查询字段 'id'”
当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?