GraphQL Float类型查询参数含义及必填参数疑问咨询
让我们结合你给出的Schema、查询语句和返回结果,逐个解决你的问题:
1. 为什么参数值不影响结果,但又是必填项?
问题的核心在metal字段的resolve函数里:
resolve: (root, args) => fetch( `api_url` ) .then(response => response.json())
你会发现这个函数完全没用到传入的args参数!不管你给silver_bid_usd_toz传1、355还是任意数值,fetch请求都不会把这个参数传给后端API,API返回的永远是默认的金属价格数据,所以参数值自然不影响结果。
至于参数为什么是必填:在GraphQL中,标量类型(比如GraphQLFloat)默认是非空的——除非你显式给参数添加nullable: true配置,或者设置defaultValue。你的Schema里没做这些配置,所以客户端必须传入参数值,否则查询会直接报错。
2. 为什么不能执行{ metal(silver_bid_usd_toz) { silver_bid_usd_toz } }?
这是GraphQL的语法规则决定的:对于必填参数,你必须明确写出完整的键值对(参数名: 参数值)。只写参数名不赋值的写法不符合语法规范,GraphQL无法识别你要传递什么内容,会直接抛出语法错误。
如果你想让这个参数变成可选,修改Schema给参数加上nullable: true即可:
silver_bid_usd_toz: { type: GraphQLFloat, nullable: true // 允许客户端不传入该参数 }
这样你就能执行不带参数的查询:{ metal { silver_bid_usd_toz } }。
3. 查询GraphQL Float类型时,“第二个参数”代表什么?
我猜你是指Schema定义参数时,GraphQLFloat相关的配置选项?比如参数对象里除了type之外的其他属性?
GraphQLFloat是GraphQL的内置标量类型,在定义参数时,参数对象可以包含这些常用配置:
description: 字符串,用于描述参数用途(方便GraphQL IDE给出提示)defaultValue: 当客户端没传参数时,使用的默认值nullable: 布尔值,标记参数是否允许为null(即是否可选)extensions: 自定义扩展字段,用于添加额外元数据
如果是指查询语句里的参数,那Float类型的参数只有“参数名”和“参数值”两部分,不存在所谓的“第二个参数”——比如metal(silver_bid_usd_toz: 16.45)里,silver_bid_usd_toz是参数名,16.45是Float类型的参数值。
优化建议
如果你的后端API支持根据传入的参数返回对应数据,那需要修改resolve函数,把args里的参数传递给API:
resolve: (root, args) => fetch( `api_url?silver_bid=${args.silver_bid_usd_toz}` // 根据API实际请求格式调整 ) .then(response => response.json())
如果这个参数本来就没必要存在,直接从Schema的args里删掉它,或者设置为可选,这样客户端就不用传这个冗余参数了。
内容的提问来源于stack exchange,提问作者reknirt

