子解析器中的Graphql-Access参数

时间:2018-01-22 13:37:36

标签: graphql apollo graphql-js apollo-server

我正在使用apollo-server和apollo-graphql-tools,我有以下架构

type TotalVehicleResponse {
  totalCars: Int
  totalTrucks: Int
}

type RootQuery {
  getTotalVehicals(color: String): TotalVehicleResponse
}

schema {
  query: RootQuery
}

和解析器功能就像这样

{
  RootQuery: {
    getTotalVehicals: async (root, args, context) => {
      // args = {color: 'something'}
      return {};
    },
    TotalVehicleResponse: {
      totalCars: async (root, args, conext) => {
        // args is empty({}) here
        .........
        .........
      },
      totalTrucks: async (root, args, conext) => {
        // args is empty({}) here
        .........
        .........
      }
    }
  }
}

我的问题是如何在任何子解析器中访问root解析器(args)中可用的getTotalVehicals

4 个答案:

答案 0 :(得分:5)

after严格指代查询中提供的参数。如果您希望值对子解析器可用,您只需从父解析器返回它们。

args

答案 1 :(得分:5)

如果你知道你正在使用变量,除了接受的答案之外,还有另一种方法,使用解析器函数的第四个参数:info

info参数在其他字段中包含字段variableValues。 此字段并不严格包含父{q} args,但如果您的操作是使用传递给父解析器的变量执行的,那么您可以通过信息访问它们.variableValues来自所有相关的解析器函数。

因此,如果您的操作被调用,例如:

query GetTotalVehicalsOperation($color: String) {
  getTotalVehicals(color: $color) {
    totalCars
    totalTrucks   
  }
}

...带变量:{color:' something'}

您可以访问其他解析器中的变量:

{
  RootQuery: {
    getTotalVehicles: async (root, args, context, info) => {
      //info.variableValues contains {color: 'something'}          
      return {};
    },
    TotalVehicleResponse: {
      totalCars: async (root, args, context, info) => {
        //same here: info.variableValues contains {color: 'something'}
      },
      totalTrucks: async (root, args, context, info) => {
        //and also here: info.variableValues contains {color: 'something'}
      }
    }
  }
}

答案 2 :(得分:2)

您可以将参数添加到嵌套字段类型

只需在字段类型中添加参数,它将在嵌套的解析器参数中可用,并且还请确保将变量添加到客户端查询中。

(服务器端)

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
}

答案 3 :(得分:-2)

要了解有关在GraphQL中使用变量的更多信息

请参考这些链接(您可以在不到5分钟的时间内浏览这些链接)

https://graphql.org/learn/queries/#operation-name

https://graphql.org/learn/queries/#variables

https://graphql.org/learn/queries/#fragments

https://graphql.org/learn/queries/#using-variables-inside-fragments

您将更多地掌握操作名称,变量,片段以及片段内部变量的使用。

看看这个链接:https://www.prisma.io/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a

它将帮助您进一步了解解析程序功能的 info 参数。