GraphQl 操作中的参数?

arguments in GraphQl operations?

我无法理解客户端查询传递的参数与模式和解析器中服务器端操作中的参数之间的关系

Apollo docks 中,他们正在创建 space 向客户显示启动信息的旅行预订应用程序,该应用程序默认显示 20 个结果,当单击查看更多按钮时,它会显示另外 20 个和等等!!

现在,客户端的查询如下所示:

launches.tsx

  query GetLaunchList($after: String) {
    launches(after: $after) {
      cursor  
      hasMore
      launches {
        ...LaunchTile  // a fragment
      }
    }
  }

在架构中,Query 字段 launches 看起来像这样

type Query {
  launches( 
    pageSize: Int
    after: String
  ): LaunchConnection!

 type LaunchConnection {
    cursor: String!
    hasMore: Boolean!
    launches: [Launch]!
  }  

resolvers.js:

Query: {
    launches: async (_, { pageSize = 20, after }, { dataSources }) => {
      const allLaunches = // fetching data from a data source

      const launches = paginateResults({
        after,
        pageSize,
        results: allLaunches,
      });

      return {
        launches,
        cursor: launches.length ? launches[launches.length - 1].cursor : null,
        hasMore: // some logic to check if there are more results
      };
    }
 }

现在,我无法理解客户端查询中的 after 参数如何与模式和解析器相关,我知道客户端需要将此变量发送到服务器由模式和解析器使用,因为服务器需要知道应该将哪些数据发送给客户端,因为结果是分页的!!

graphql 如何将 after 参数关联到 after 参数在模式和解析器中启动??

只有一件事可以 'mysterious',不明显 - 内联解构 ...

来自 general graphql server docs - 解析器函数采用 4 个参数 (obj, args, context, info),其中

args - The arguments provided to the field in the GraphQL query.

您的解析器

`launches: async (_, { pageSize = 20, after }, { dataSources }) => {`

使用 ES6 解构赋值语法,'shortened version' of:

launches: async (_, args, context) => {
  const { pageSize = 20, after } = args;
  const { dataSources } = context;`

从架构 launches 可以有 2 个参数(pageSizeafter),它们作为 args 对象属性传递给解析器。

两个参数都是可选的(可以为空——也来自模式),但处理方式略有不同——请参阅 default/fallback:

的解构声明
  const { pageSize = 20, after } = args;

对于缺少的两个参数(客户未提供)pageSize 将使用默认值 20after 将被 null 编辑。

对于传递的两个参数 - 将使用两个值(而不是默认值)。

这是描述的标准 JS ES6 行为 here