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

GraphQL中查看器字段的含义是什么?,graphql,relayjs,Graphql,Relayjs,GraphQL中根查询字段viewer的用途是什么 基于,viewer可用于接受令牌参数,以便查看当前登录的用户 我应该如何实现它?查看者的目的根查询字段 viewer不是特定于GraphQL或中继的内容。大多数web应用程序服务于其用户或查看者的某些目的。为用户提供的各种数据建模的顶级实体可以命名为viewer。您还可以将其命名为user。例如,具有查看器根查询字段: viewer: { type: GraphQLUser, resolve: () => getViewer(),

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

基于,
viewer
可用于接受令牌参数,以便查看当前登录的用户

我应该如何实现它?

查看者的目的根查询字段
viewer
不是特定于GraphQL或中继的内容。大多数web应用程序服务于其用户或查看者的某些目的。为用户提供的各种数据建模的顶级实体可以命名为
viewer
。您还可以将其命名为
user
。例如,具有
查看器
根查询字段:

viewer: {
  type: GraphQLUser,
  resolve: () => getViewer(),
},
我们也可以不使用
viewer
。例如,没有任何
viewer
根查询字段

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

实现:如何与查看器一起使用身份验证令牌 我的回答遵循了你提到的文章中已经描述的内容。这些步骤是:

  • 在服务器端,创建一个变种以获得身份验证令牌。让我们把它命名为
    LoginMutation
    。此变异的输入是用户凭据,输出是身份验证令牌

  • 在客户端,如果使用,则实现客户端变异。变异成功后,存储身份验证令牌

  • 在客户端中继代码中,为您的
    viewer
    查询添加
    authToken
    参数。
    authToken
    的值是成功登录后收到的身份验证令牌

  • 替代方案 正如本文中已经提到的,验证用户身份的另一种方法是在GraphQL之外进行验证。您可能希望看到两个极好的答案,并了解详细信息


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

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

    #示例1
    克尔{
    观众{
    故事{…}#已发布存储以及草稿的列表(当前用户)
    }
    故事{…}#已发布故事列表(所有用户)
    }
    
    当前记录的用户数据要么合并到
    viewer
    字段本身中,要么嵌套在该字段下:

    #示例2
    质疑{
    观众{
    身份证件
    电子邮件
    显示名称
    故事{…}
    }
    }
    #例3
    质疑{
    观众{
    我{id email displayName}
    故事{…}
    }
    }
    
    上述三个示例都可以通过删除
    viewer
    字段来简化,并且仍然具有完全相同的功能(推荐):

    查询{
    #当前登录的用户,如果未登录,则为NULL
    我{
    身份证件
    电子邮件
    显示名称
    }
    #仅发布的故事(所有用户)
    故事{
    ...
    }
    #已发布的故事和草稿(当前用户)
    故事(草稿:真实){
    ...
    }
    }
    

    您可以找到完整的示例,其中可以用作参考项目或新开发的种子/模板。请参阅。

    在Relay ModernIt中不再需要查看器模式。奇怪的是,我找不到任何具体的示例(使用SQL或Mongo),只是对这个主题进行了大量抽象。希望有一个真实的例子,只是想看看实现。我不再推荐查看器模式,它是一个中继经典的东西,你应该使用me:UserType字段,而不是检查中继车间,以获得更好的示例。为什么你(或谁)建议不要查看器,而是独立查询?(仍在学习)因为它更简单、更干净;虽然引入“查看器”字段听起来像是试图解决一些假设的(不存在的)问题,但我不同意这一建议。经过身份验证的用户和任何其他常规用户有非常不同的关注点和需要解决的问题,特别是哪些字段应该是可见的。您不应该能够查询平台上任何用户的SSN,但应该能够查询您自己登录的SSN。@各个字段的交易权限在实体GraphQL类型中强制执行(与“查看器”顶级字段无关)。举个例子:我仍然不同意@KonstantinTarkus。你的例子很琐碎,随着时间的推移,你对用户的定义变得模糊。比如说,现在你需要引入“团队成员”的概念,从技术上讲,团队成员是用户,如果你在同一个团队中,你应该能够查询他们的电子邮件地址。您的冲突解决程序将使用大量if语句膨胀,试图确定用户是否可以查看它。真正的解决方案是一个用户界面,以及实现该界面的对象:查看器、团队成员等等。