GraphQL

时间:2018-09-28 19:52:42

标签: javascript graphql apollo-server

我在GraphQL服务器上有一个“查看器上下文”的概念。对于大多数对象,如果“查看者上下文”表明该对象不可见,则加载器仅拒绝加载该对象。这是实现对象级隐私的好方法,但是我需要为系统中的某些对象实现字段级隐私。具体来说,我有一个Challenge类型,其中包含一个senderArmy字段。当查看者是发送者时,senderArmy应该可见,但是当查看者是接收者时,Challenge应该不可见。 const schema = gql` type Challenge { senderArmy: String } type User { challenges: [Challenge!] } `; const resolver = { Challenge: (obj) => obj.getFilteredFields(), User: { challenges: (obj) => obj.getChallenges(), } }; 对象上的其他字段对双方均应可见。

我已经考虑了几个选项:

  • 我可以通过拒绝加载该列来使数据库对象“屏蔽”该字段。当我尝试更新记录时,这会导致问题,因为我不希望更新在保存时将该字段实际设置为null。
  • 我可以让我的现场解析器实施现场可见性检查。这导致逻辑上的尴尬分裂,其中解析器中实现了字段级隐私,而模型中实现了对象级隐私。
  • 我可以使用可感知隐私的getter方法来让我的父级解析器“屏蔽”该字段。这会导致一个危险的情况,即忘记在解析器上使用此方法会导致查询工作正常,但不尊重字段级隐私。

我认为理想的情况是可以设置对象级解析器。这样的事情将是理想的:

makeExecutableSchema

这样编码时,Challenge会忽略我的对象级getFilteredFields解析器。是否有某种方法可以完成我要寻找的工作,而无需在每个返回Challenge对象的解析器上调用<p> <img alt="" src="https://r1.ilikewallpaper.net/ipad-wallpapers/download/26516/Natural-Grove-Green-Trees-Path-ipad-wallpaper-ilikewallpaper_com.jpg" style="height: 85px; width: 198px" id="imgClickAndChange" onclick="changeImage()" /> </p>

谢谢!

0 个答案:

没有答案