Apollo Server:将参数传递给嵌套的解析器
Apollo Server: pass arguments to nested resolvers
我的 GraphQL 查询如下所示:
{
p1: property(someArgs: "some_value") {
id
nestedField {
id
moreNestedField {
id
}
}
}
}
在服务器端,我使用的是 Apollo Server。
我有一个 property
的解析器和 nestedField
和 moreNestedField
的其他解析器。
我需要在我的嵌套解析器上检索 someArgs
的值。
我尝试使用解析器上可用的 context
来做到这一点:
property: (_, {someArgs}, ctx) => {
ctx.someArgs = someArgs;
// Do something
}
但这不会起作用,因为上下文在所有解析器之间共享,因此如果我的查询有多个 property
,上下文值将不会很好。
我还尝试在我的嵌套解析器上使用 info
上可用的 path
。我可以转到 property
字段,但我这里没有参数...
我也尝试在 info
上添加一些数据,但它不会在嵌套解析器上共享。
在所有解析器上添加参数不是一个选项,因为它会使查询变得非常臃肿且编写起来很麻烦,我不希望那样。
有什么想法吗?
谢谢!
您可以像这样通过父字段传递值:
function propertyResolver (parent, { someArgs }) {
const property = await getProperty()
property.someArgs = someArgs
return property
}
function nestedPropertyResolver ({ someArgs }) {
const nestedProperty = await getNestedProperty()
nestedProperty.someArgs = someArgs
return nestedProperty
}
function moreNestedPropertyResolver ({ someArgs }) {
// do something with someArgs
}
请注意,这是否有效,它也可能首先指出您的架构设计存在潜在问题。根据您解析这些字段的方式(从数据库中获取它们、向另一个 API 发出请求等),最好完全采用不同的方法——例如,通过预先加载所有内容根解析器。但是,如果没有更多上下文,很难提出任何其他建议。
可以使用当前返回值将参数传递给子解析器。稍后将从响应中删除其他数据。
我将 'borow' Daniel 的代码,但没有特定参数 - 将参数作为参考传递下来(suitable/cleaner/more 可读更多参数):
function propertyResolver (parent, args) {
const property = await getProperty()
property.propertyArgs = args
return property
}
// if this level args required in deeper resolvers
function nestedPropertyResolver (parent, args) {
const nestedProperty = await getNestedProperty()
nestedProperty.propertyArgs = parent.propertyArgs
nestedProperty.nestedPropertyArgs = args
return nestedProperty
}
function moreNestedPropertyResolver (parent) {
// do something with parent.propertyArgs.someArgs
}
正如 Daniels 所说,此方法的功能有限。您可以 chain
结果并在子解析器中有条件地做一些事情。您将拥有父级和过滤后的子级……未使用子级条件过滤父级(如 SQL ... WHERE ... AND ... AND ... 在连接表上),这可以在父解析器。
请在此处检查此答案以了解如何传递参数:
为了简化它,您可以使用 args 定义您的字段类型:
在您的类型定义中
type Query{
getCar(color: String): Car
... other queries
}
type Car{
door(color: String): Door // <-- added args
id: ID
previousOwner(offset: Int, limit: Int): Owner // <-- added args
...
}
然后,在您的客户端查询中(来自 apollo 客户端或您的 gql 查询):
query getCar(carId:'123'){
door(color:'grey') // <-- add variable
id
previousOwner(offset: 3) // <-- added variable
... other queries
}
您应该能够在子解析器参数中访问颜色:
在您的解析器中:
Car{
door(root,args,context){
const color = args.color // <-- access your arguments here
}
previousOwner(root,args,context){
const offset = args.offset // <-- access your arguments here
const limit = args.limit // <-- access your arguments here
}
...others
}
以你的例子为例:
就会这样
{
p1: property(someArgs: "some_value") { // <-- added variable
id
nestedField(someArgs: "some_value") { // <-- added variable
id
moreNestedField(offset: 5) {
id
}
}
}
}
我的 GraphQL 查询如下所示:
{
p1: property(someArgs: "some_value") {
id
nestedField {
id
moreNestedField {
id
}
}
}
}
在服务器端,我使用的是 Apollo Server。
我有一个 property
的解析器和 nestedField
和 moreNestedField
的其他解析器。
我需要在我的嵌套解析器上检索 someArgs
的值。
我尝试使用解析器上可用的 context
来做到这一点:
property: (_, {someArgs}, ctx) => {
ctx.someArgs = someArgs;
// Do something
}
但这不会起作用,因为上下文在所有解析器之间共享,因此如果我的查询有多个 property
,上下文值将不会很好。
我还尝试在我的嵌套解析器上使用 info
上可用的 path
。我可以转到 property
字段,但我这里没有参数...
我也尝试在 info
上添加一些数据,但它不会在嵌套解析器上共享。
在所有解析器上添加参数不是一个选项,因为它会使查询变得非常臃肿且编写起来很麻烦,我不希望那样。
有什么想法吗?
谢谢!
您可以像这样通过父字段传递值:
function propertyResolver (parent, { someArgs }) {
const property = await getProperty()
property.someArgs = someArgs
return property
}
function nestedPropertyResolver ({ someArgs }) {
const nestedProperty = await getNestedProperty()
nestedProperty.someArgs = someArgs
return nestedProperty
}
function moreNestedPropertyResolver ({ someArgs }) {
// do something with someArgs
}
请注意,这是否有效,它也可能首先指出您的架构设计存在潜在问题。根据您解析这些字段的方式(从数据库中获取它们、向另一个 API 发出请求等),最好完全采用不同的方法——例如,通过预先加载所有内容根解析器。但是,如果没有更多上下文,很难提出任何其他建议。
可以使用当前返回值将参数传递给子解析器。稍后将从响应中删除其他数据。
我将 'borow' Daniel 的代码,但没有特定参数 - 将参数作为参考传递下来(suitable/cleaner/more 可读更多参数):
function propertyResolver (parent, args) {
const property = await getProperty()
property.propertyArgs = args
return property
}
// if this level args required in deeper resolvers
function nestedPropertyResolver (parent, args) {
const nestedProperty = await getNestedProperty()
nestedProperty.propertyArgs = parent.propertyArgs
nestedProperty.nestedPropertyArgs = args
return nestedProperty
}
function moreNestedPropertyResolver (parent) {
// do something with parent.propertyArgs.someArgs
}
正如 Daniels 所说,此方法的功能有限。您可以 chain
结果并在子解析器中有条件地做一些事情。您将拥有父级和过滤后的子级……未使用子级条件过滤父级(如 SQL ... WHERE ... AND ... AND ... 在连接表上),这可以在父解析器。
请在此处检查此答案以了解如何传递参数:
为了简化它,您可以使用 args 定义您的字段类型:
在您的类型定义中
type Query{
getCar(color: String): Car
... other queries
}
type Car{
door(color: String): Door // <-- added args
id: ID
previousOwner(offset: Int, limit: Int): Owner // <-- added args
...
}
然后,在您的客户端查询中(来自 apollo 客户端或您的 gql 查询):
query getCar(carId:'123'){
door(color:'grey') // <-- add variable
id
previousOwner(offset: 3) // <-- added variable
... other queries
}
您应该能够在子解析器参数中访问颜色:
在您的解析器中:
Car{
door(root,args,context){
const color = args.color // <-- access your arguments here
}
previousOwner(root,args,context){
const offset = args.offset // <-- access your arguments here
const limit = args.limit // <-- access your arguments here
}
...others
}
以你的例子为例:
就会这样
{
p1: property(someArgs: "some_value") { // <-- added variable
id
nestedField(someArgs: "some_value") { // <-- added variable
id
moreNestedField(offset: 5) {
id
}
}
}
}