Should/Can 我对嵌套解析器上的数据进行了更改?

Should/Can I make changes to data on nested resolvers?

假设我有一个 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 将被调用以从源中获取数据。

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

可以,但不应该。字段解析器实际上是用来获取数据的。将 create/update/delete 逻辑放入嵌套的解析器中可能很快就会出现问题,并引入您希望使用 graphql 解决的相同问题。

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

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

如果您仍然想尝试,您可以 return 在根解析器的 returned 对象上添加一个 action 字段,然后在嵌套的仅当您看到该字段时才使用解析器。确保你 return 在嵌套解析器上更改的数据。