【问题标题】:Passing a list of custom types to a GraphQL mutation将自定义类型列表传递给 GraphQL 突变
【发布时间】:2018-02-22 19:04:18
【问题描述】:

我的应用程序的目标是让用户能够保存和调用要填写和编辑的表单列表。一个用户将有许多表单,而一个表单将由它自己的多个字段组成。

如果我的类型是这样设置的,例如:

const FormType = new GraphQLObjectType({
  name: 'FormType',
  fields: {
    id: { type: GraphQLID },
    name: { type: GraphQLString },
    email: { type: GraphQLString }
  }
});
const UserType = new GraphQLObjectType({
  name: 'UserType',
  fields: {
    id: { type: GraphQLID },
    email: { type: GraphQLString },
    firstName: { type: GraphQLString, default: '' },
    lastName: { type: GraphQLString, default: '' },
    phone: { type: GraphQLString, default: '' },
    forms: { type: new GraphQLList(FormType) }
  }
});

我的突变是这样的:

const mutation = new GraphQLObjectType({
  name: 'Mutation',
  fields: {
    saveForm: {
      type: UserType,
      args: {
        userID: { type: GraphQLID },
        form: { type: FormType } // ???
      },
      resolve(parentValue, { userID, form }) {
        // I'll figure out what to do here when the time comes
      }
    }
  }
});

我似乎无法创建适用于GraphQLList 的突变。我不断收到此错误:

错误:Mutation.saveForm(form:) 参数类型必须是输入类型,但是 得到:FormType。

...我的研究告诉我,FormType 必须是GraphQLInputObjectType。当我相应地更改它时,我只是得到错误:

错误:Mutation.saveForm(form:) 参数类型必须是输出类型,但是 得到:FormType。

所以没有什么真正改变。有谁知道这个问题的工作示例?

【问题讨论】:

    标签: javascript node.js mongoose graphql apollo


    【解决方案1】:

    您看到的问题是因为虽然您已正确地将输入类型更改为GraphQLInputObjectType,但也将字段UserType.forms 的类型更改为输入类型 - 请记住UserType 是输出类型。在这里,您需要创建一个FormType 和一个FormInputType,并在适当的位置使用它们。

    另外:为什么表单需要完整的输入类型?只传递 ID 不是同样好用吗?或者,如果打算让FormType 代表表单数据,为什么它需要一个 ID?另外,也许它可以更好地命名为FormData

    最后,虽然我相信这提供了一个答案,但您的问题并没有提供完全可剪切+可粘贴的代码,以提供最小、完整且可验证的示例,以便我可以轻松检查。

    【讨论】:

    • 因此,与其尝试传入 FormTypes 对象的列表,不如传入它们的 ID 列表?这很有意义,我认为这也不会扰乱 GraphQLList。最初考虑表单的输入类型是因为表单本身非常复杂,我想从几个较小的类型创建它,类似于我的 React 组件的结构。我想一旦我知道如何将 Form 类型传递给用户,那么我可以将相同的逻辑应用于表单子类型。
    • 我想我在这里遗漏了一些东西。在我可以将它传递给User之前,我是否需要一个单独的突变来保存表单(从而生成ID)?我知道我可能遗漏了一些东西,但是几天来我一直没有在这方面取得任何进展,而且它开始让我陷入困境。如果我在这一点上说的任何话似乎很明显,我深表歉意。我将提供任何我可以进一步澄清以使其更易于理解的内容。
    • 没有理由道歉!这仍然是相当前沿的东西。我对原始标题“传递自定义类型列表”不太正确吗?实际上您需要传入一组(或 GraphQL 术语中的对象)表单数据?在我看来,“形式”在这里并不是真正重要的东西,而可能是一系列问题?
    • 另外,请检查并让我们都知道我第一段中的最后一句话是否正确:您可以使用GraphQLObjectTypeGraphQLInputObjectType的并行“类型”实现您想要的?
    • 只是想我会回来告诉你我一直需要的 InputObjectTypes。 :) 我只是没有完全理解如何从你的评论中实现它们,但它最终让我走上了正确的轨道。不用说,我现在对 GraphQL 和 Mongoose 有了更多的了解。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2020-05-05
    • 2013-05-14
    • 2019-05-12
    • 2020-02-07
    • 2020-11-19
    • 2020-07-21
    • 2017-08-26
    相关资源
    最近更新 更多