将您的参数添加到字段
(客户端)更改自:
Car(type: $type, materialType: $materialType){
id
material
name
...
}
(客户端)收件人:
Car(type: $type){
id,
material(materialType: $materialType) // moved here
name
...
}
然后,在您的服务器 fieldResolver(本例中为 material 字段)中访问您的参数。
加长版
尽量不要通过root 传递你的参数,除了IDs、arguments that is not from client 或a parent object,其他任何东西都使用字段级参数 (除非你有一个非常好的理由不)
为什么?
有几个原因:
-
紧耦合
它会导致耦合,并且很难扩展模式
-来自评论部分的@Bruno Ribeiro:
-
难以排除故障
一个级别仍然可以,但是当您公司中的某个人找到一种方法将参数深入到根源时,很难调试它是如何丢失的。
-
向孩子泄露不必要的信息
通过 root 传递参数也意味着传递给其他每个孩子,无论是否需要。
-
混合父对象和参数
您的父对象可能具有与参数相同的属性键,例如:offset,通过提供另一个偏移量,您可能会得到不希望的结果。
怎么做?
一个简单的查询可以由此扩展:
[Root] Car(
color:white,
type:sedan,
seat:leather
) {
id,
seat,
numberOfPassengers,
...
}
到这里:
[Root] Car(
color:white,
type:sedan,
seat:leather,
seatColor:black,
rimColor: blue,
rimShape: OutOfTheWorld,
...
) {
id,
seat,
numberOfPassengers,
...
}
你可以这样做
[Root] Car(
color:white,
type:sedan
...
) {
id
seat(type:leather, color:black),
rim(color: blue, shape: OutOfTheWorld){
// nested query
material(hardness: high), // solved `Why no.2`: deep argument.
// More nested
brand(trustWorthy: high) {
priceRange(range: mid),
area,
...
},
id
}
numberOfPassengers,
...
}
现在不是将所有参数集中到一个根中,而是每个字段负责其参数和解析器。
什么时候申请?
每当您发现自己为该字段创建专用解析器时,将参数传递给该字段(不是 root,更糟糕的是:info)
长啸结束。
######################
这部分是回答主持人的问题。
我的问题是如何访问根目录中可用的 args
任何子解析器中的解析器(getTotalVehicals)?
(服务器端)
type RootQuery {
getTotalVehicles(color: String): TotalVehicleResponse
}
type TotalVehicleResponse {
totalCars(color: String): Int // <-- added arguments
totalTrucks(offset: Int, limit: Int): Int // <-- added arguments
}
schema {
query: RootQuery
}
然后,您可以在解析器参数字段中访问此参数:
// In your child resolver
TotalVehicleResponse{
totalCars(parent, args, ctx){
const {color} = args // <-- access your client args here
return ....
}
totalTrucks(parent, args, ctx){
const {offset, limit} = args // <-- your args from client query
...do db query
return ....
}
}
在您的客户查询中
(客户端)
不要忘记在嵌套查询字段中添加变量。
getTotalVehicles(color: $color){
totalCars(color: $color) <-- add your variable here
totalTrucks(offset: $offset, limit: $limit) <-- add your variable here
}