首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GraphQL对象查询中使用变量

在GraphQL对象查询中使用变量
EN

Stack Overflow用户
提问于 2018-01-19 16:20:32
回答 1查看 2.8K关注 0票数 0

我正在研究GraphQL JS教程,并试图了解变量是如何处理查询的。

对象类型部分中,我可以让它正常工作:

我的server.js文件:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
{
  "query": "query RollDice($sides: Int) { getDie(numSides: $sides) { rollOnce roll(numRolls: 3) }}",
  "variables": {
    "sides": 6
  }
}

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

代码语言:javascript
复制
http http://localhost:4000/graphql < ./random.json

我得到了这个输出:

代码语言:javascript
复制
{
  "data": {
    "getDie": {
      "roll": [
        1,
        6,
        2
      ],
      "rollOnce": 5
    }
  }
}

我的问题是:

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

我试过这个:

代码语言:javascript
复制
{
  "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!\"."

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-20 01:24:31

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

代码语言:javascript
复制
type RandomDie {
  roll(numRolls: Int!): [Int]
}

type Query {
  getDie(numSides: Int): RandomDie
}

注意,numSides只是一个Int,而numRolls被定义为一个Int!,这就是为什么$sides不需要! (实际上,使$sides成为Int!也会抛出一个错误!)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48345367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档