【问题标题】:Should/Can I make changes to data on nested resolvers?我应该/我可以更改嵌套解析器上的数据吗?
【发布时间】:2016-11-21 00:23:35
【问题描述】:

假设我有这样的MemberType

import {
  GraphQLID,
  GraphQLList,
  GraphQLNonNull,
  GraphQLObjectType,
  GraphQLString
} from 'graphql'
import readPhoneNumbersByMemberId from '../resolvers/readPhoneNumbersByMemberId'
import PhoneNumberType from './PhoneNumberType'

const MemberType = new GraphQLObjectType({
  name: 'Member',
  fields: {
    id: {
      type: new GraphQLNonNull(GraphQLID)
    },
    firstName: {
      type: new GraphQLNonNull(GraphQLString)
    },
    lastName: {
      type: new GraphQLNonNull(GraphQLString)
    },
    phoneNumbers: {
      type: new GraphQLList(PhoneNumberType),
      resolve: readPhoneNumbersByMemberId
    }
  }
})

export default MemberType

还有一个像这样的PhoneNumberType

import {
  GraphQLNonNull,
  GraphQLObjectType,
  GraphQLString
} from 'graphql'

const PhoneNumberType = new GraphQLObjectType({
  name: 'PhoneNumber',
  fields: {
    value: {
      type: new GraphQLNonNull(GraphQLString)
    }
  }
})

export default PhoneNumberType

还有一个像这样的QueryType

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    readMembers: {
      type: new GraphQLList(MemberType),
      resolve: readMembers
    }
  }
})

现在,如果我查询 GraphQL 架构以检索成员,则将调用解析函数 readMembersreadPhoneNumbersByMemberId 从源获取数据。

是否可以对突变使用相同的机制?

【问题讨论】:

  • 您的意思是使用与突变解析器相同的解析器逻辑?
  • 我的意思是,是否可以利用相同的“解析器级联”来运行创建/更新语句?
  • 我是否必须改为在根解析器上执行所有创建/更新语句?

标签: graphql graphql-js


【解决方案1】:

你可以,但你不应该。字段解析器真的是用来获取数据的。将创建/更新/删除逻辑放在嵌套解析器中可能很快就会出现问题,并引入您希望使用 graphql 解决的相同问题。

Facebook 为任何作为参数发送给突变(或查询)的复合对象创建了一个名为 input 的完整特殊类型,这非常令人沮丧。

如果您可以解释拆分突变逻辑的好处,那么对于 GraphQL 规范来说,接受每个字段的 mutate 函数可能是一个很好的 RFC,这样您将保持突变逻辑分离,同时实现相同的嵌套性质。

如果您仍然想尝试这样做,您可以在从根解析器返回的对象上返回一个 action 字段,并仅在您看到该字段时对嵌套解析器进行您想要的更改。确保返回在嵌套解析器上更改的数据。

【讨论】:

  • 感谢您的回复。我知道 readPhoneNumbersByMemberId 会在突变后检索电话号码,但我想知道是否可以使用 mutatePhoneNumbersByMemberId 让嵌套类型负责创建/更新操作。
  • 我试过了,但似乎我必须在根解析器中实现所有创建/更新逻辑。
  • 哦,我现在明白了。您可以使用将传播到您的 phoneNumbersByMemberId 的操作标志使其工作,但不鼓励这样做。您应该在根解析器上创建突变逻辑,并让嵌套类型解析器只处理数据检索。如果您可以将问题更改为“应该/我可以更改嵌套解析器上的数据吗?”我会回答这个问题,以便将来的开发人员提出同样的问题。
  • 再次感谢。标题已更改。
猜你喜欢
  • 2012-03-09
  • 2021-12-09
  • 2022-12-28
  • 1970-01-01
  • 2019-01-21
  • 2013-08-11
  • 2020-11-07
  • 2014-03-14
  • 2022-12-16
相关资源
最近更新 更多