Graphql根据info.rootValue

时间:2019-07-08 11:41:05

标签: graphql apollo graphql-js apollo-server

所以我有一个内部联合类型,需要在运行时解析。在父对象上,我有一个type字段,它将告诉我发生了什么类型的突变,在同一个父对象上,我有一个payload字段,它是这种并集类型。

enum OrgMutationType {
   JOIN_ORG
   LEAVE_ORG
   CHANGE_PERMISSIONS
}

union OrgMutatedSubscriptionPayloadUnion =
     JoinOrgMutationResponse |
     LeaveOrgMutationResponse |
     ChangePermissionsMutationResponse

type OrgMutatedSubscriptionPayload {
    type: OrgMutationType
    payload: OrgMutatedSubscriptionPayloadUnion
}

extend type Subscription {
   orgMutated(organization: ID!): OrgMutatedSubscriptionPayload
}

__resolveType函数中,我得到了payload对象,并根据该对象需要解析类型。不幸的是,它们payload不包含type对象

所以我拥有的是

  OrgMutatedSubscriptionPayloadUnion: {
      __resolveType(payload) {
          // Here i need to access the `parent.type` to make a switch
          // and return the appropriate type
      }
  }

我要访问的是包含type字段的父对象,以便我以此为基础进行切换。

我发现,在info对象(__resolveType函数中的第三个参数)中,我可以访问rootValue,这将使我可以访问type字段。父母 所以我可以做到

  OrgMutatedSubscriptionPayloadUnion: {
      __resolveType(payload, context, info) {
          switch(info.rootValue.type) {
              case('JOIN_ORG'): 
                   return 'JoinOrgMutationResponse';
              case('LEAVE_ORG'): 
                   return 'LeaveOrgMutationResponse';
              ...
          }
      }
  }

这样访问它是一个好主意吗?有陷阱吗?

否则,我正在考虑的另一种解决方案是使整个父类型成为联合,这将使我能够访问type字段并基于该字段进行切换。在那种情况下,尽管我看到我将需要复制更多类型来创建此联合。

有什么建议吗? info.rootValue是有效的解决方案吗?

0 个答案:

没有答案