GraphQL 中查看器字段的含义是什么?

What is the meaning of viewer field in GraphQL?

GraphQL 中根查询字段 viewer 的用途是什么?

基于 this articleviewer 可用于接受令牌参数,以便我们可以查看当前登录的用户。

我该如何实施?

viewer 根查询字段的用途

viewer 不是 GraphQL 或 Relay 特定的东西。大多数网络应用程序服务于其用户或查看者的某些目的。为用户提供的各种数据建模的顶级实体可以命名为 viewer。您也可以将其命名为 user。例如,Relay todo example 有一个 viewer 根查询字段:

viewer: {
  type: GraphQLUser,
  resolve: () => getViewer(),
},

我们也可以不用 viewer。例如,Relay starwars example 没有任何 viewer 根查询字段。

简而言之,将此 viewer 作为 GraphQL 模式的根查询字段使我们能够提供基于当前用户的数据。

实施:如何将身份验证令牌与查看器一起使用

我的回答是按照你提到的文章中已经描述的内容。步骤是:

  1. 在服务器端,创建一个突变来获取身份验证令牌。我们将其命名为 LoginMutation。此突变的输入是用户凭据,输出是身份验证令牌。

  2. 在客户端,如果您使用 relay framework,请实施客户端变更。变异成功后,存储认证token

  3. 在客户端中继代码中,为您的 viewer 查询添加 authToken 参数。 authToken的值为登录变异成功后收到的认证token。

另一种选择

正如文章中已经提到的,另一种验证用户身份的方法是在 GraphQL 之外进行。您可能希望看到两个出色的答案 and 了解详情。

Jonas Helfer 就此写了一篇分为两部分的文章,您会发现它非常有用:Part 1, Part 2

viewer 字段(设计模式)背后的想法是对仅与当前登录用户相关的顶级查询字段进行分组。例如:

# EXAMPLE 1

quer {
  viewer {
    stories { ... } # the list of published stores as well as drafts (current user)
  }

  stories { ... }   # the list of published stories (all users)
}

此当前记录的用户数据已合并到 viewer 字段本身或嵌套在其下:

# EXAMPLE 2

query {
  viewer {
    id
    email
    displayName
    stories { ... }
  }
}

# EXAMPLE 3

query {
  viewer {
    me { id email displayName }
    stories { ... }
  }
}

上面的所有三个示例都可以通过完全删除 viewer 字段来简化,并且仍然具有完全相同的功能(推荐):

query {
  # The currently logged in user or NULL if not logged in
  me {
    id
    email
    displayName
  }

  # Published stories only (all users)
  stories {
    ...
  }

  # Published stories as well as drafts (the current user)
  stories(drafts: true) {
    ...
  }
}

您可以在 GraphQL API and Relay Starter Kit which can be used either as a reference project or a seed/template for new developments. See api/graphql.ts 中找到完整的示例。