答案 0 :(得分:34)
viewer
根查询字段 viewer
不是GraphQL或Relay特有的。大多数Web应用程序都为其用户或查看者提供某些用途。用于对提供给用户的各种数据建模的顶级实体可以命名为viewer
。您也可以将其命名为user
。例如,Relay todo example有一个viewer
根查询字段:
viewer: {
type: GraphQLUser,
resolve: () => getViewer(),
},
我们也可能没有viewer
。例如,Relay starwars example没有任何viewer
根查询字段。
简而言之,将此viewer
作为GraphQL架构的根查询字段使我们能够根据当前用户提供数据。
我的回答遵循您提到的文章中已经描述的内容。步骤是:
在服务器端,创建一个变异以获取身份验证令牌。我们将它命名为LoginMutation
。此突变的输入是用户凭证,输出是身份验证令牌。
在客户端,如果使用relay framework,请实施客户端突变。突变成功后,存储身份验证令牌。
在客户端中继代码上,为authToken
个查询添加viewer
参数。 authToken
的值是成功登录突变后收到的身份验证令牌。
正如文章中已经提到的,对用户进行身份验证的另一种方法是在GraphQL之外进行。您可能希望查看两个优秀的答案this和this以获取详细信息。
答案 1 :(得分:1)
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) {
...
}
}
您可以在React Starter Kit中找到完整的示例,该示例可用作参考项目或新开发的种子/模板。参见src/server/schema.js
。