使用GraphQL自定义输入类型的正确方法是什么?

时间:2019-08-31 00:35:18

标签: reactjs typescript graphql type-graphql

我是GraphQL的新手,正在尝试实现args类以用作自定义输入类型。

这是我班的一个例子:

@ArgsType()
export class CreateVariableArgs {
    ... other properties

    @Field(type => String, { nullable: true })
    customClass?: customClassInputType[];
}

这是我的输入类型:

@ArgsType()
export class customClassInputType {
    @Field(type => String)
    name: string;

    @Field(type => Boolean)
    isDefault: boolean;

    ... other properties
}

我想做的是从React Typescript UI传递我的自定义实体的数组。我的查询是对我的GraphQL服务器的变异请求。我想在解析器中做一些工作,最终将数据保存在PostGres数据库中,然后将数据返回或向UI抛出错误。

当前,我的graphQL服务器不知道自定义输入类型是什么。一定有一种方法可以使GraphQL不仅可以处理原始标量类型,但是我找不到任何文档,并且在此问题上花了一个星期没有成功。任何帮助将不胜感激。

这是我在调试控制台中遇到的错误。

{"message":"Cannot determine GraphQL input type for customClass","level":"error"}
{"message":"Error: Cannot determine GraphQL input type for customClass\n    at Function.getGraphQLInputType (node_modules/type-graphql/dist/schema/schema-generator.js:415:19)\n    at argumentType.fields.forEach.field (node_modules/type-graphql/dist/schema/schema-generator.js:361:28)\n    at Array.forEach (<anonymous>)\n    at Function.mapArgFields (node_modules/type-graphql/dist/schema/schema-generator.js:357:29)\n    at params.reduce (node_modules/type-graphql/dist/schema/schema-generator.js:350:22)\n    at Array.reduce (<anonymous>)\n    at Function.generateHandlerArgs (node_modules/type-graphql/dist/schema/schema-generator.js:332:23)\n    at handlers.reduce (node_modules/type-graphql/dist/schema/schema-generator.js:285:28)\n    at Array.reduce (<anonymous>)\n    at Function.generateHandlerFields (node_modules/type-graphql/dist/schema/schema-generator.js:278:25)","level":"error"}

是否可以使用自定义类型?还是我仅限于对自定义类型数组进行字符串化处理并以这种形式使用它们?

2 个答案:

答案 0 :(得分:0)

您应该更改customClassInputType

@InputType()
export class customClassInputType {
    @Field(type => String)
    name: string;

    @Field(type => Boolean)
    isDefault: boolean;

    ... other properties
}

并使用如下的customClassInputType

@ArgsType()
export class CreateVariableArgs {
    ... other properties

    @Field(() => customClassInputType, {nullable:true})
    customClass?: customClassInputType[];
}

因为@InputType会生成实际的GraphQLInputType,因此当您希望在args中嵌套对象时应使用

和@ArgsType是虚拟的,它将在模式中展平:

更多详细信息可以在这里找到 https://typegraphql.ml/docs/0.17.0/faq.html

答案 1 :(得分:-1)

很明显,您可以使用自定义类型。 但我不知道如何使它在打字稿中工作

我正在使用JavaScript中的graphql库,它为查询提供了GraphQLObjectType,为Mutation提供了GraphQLInputObjectType,可让您创建自己的新类型

import { GraphQLObjectType, GraphQLString } from 'graphql'

export default new GraphQLObjectType({
  name: 'UserType',
  fields: () => ({
    username: {
      type: GraphQLString,
      resolve: () => 'name',
    },
  }),
})

对不起,帮不上忙