模式生成器无法确定DTO中的自定义对象的GraphQL输出类型

时间:2019-07-04 09:47:58

标签: node.js express graphql type-graphql

来自laravel背景,我尝试进入node.js / graphQL / mongoDB并偶然发现了nest.js框架,看起来很不错。因此,我尝试设置一个简单的GraphQL API进行测试并了解其工作原理。因此,我为用户创建了猫鼬模式,并为模型(type-graphql)和DTO创建了一个通过变异创建此类用户的模型。

这工作得很好,但是我想在用户内添加一个称为设置的嵌套对象,以尝试如何工作,但我根本不了解它,也找不到任何nest.js或{{1 }}此类实现的具体示例。使用type-graphql的“代码优先”方法根本不可行吗?因为模式生成器在编译时总是给我一个错误:

  

“ UnhandledPromiseRejectionWarning:错误:无法确定设置的GraphQL输出类型”。

user.model.ts

nest.js

user.settings.type.ts

import { Field, ID, ObjectType } from 'type-graphql'
import UserSettingsType from './user.settings.type'

@ObjectType()
export class User {
  @Field((type) => ID)
  id: string

  @Field()
  email: string

  @Field((type) => UserSettingsType)
  settings: {}
}

new-user.input.ts

import { Field, ObjectType } from 'type-graphql'

@ObjectType()
export class UserSettings {
  @Field()
  theme: string

  @Field()
  description?: string

  @Field((type) => [String])
  visited: string[]
}

如您所见,我在一个单独的文件中定义了一个新的类型UserSettings(遵循import { IsOptional, IsEmail, IsBoolean, Length, MaxLength, IsArray } from 'class-validator' import { Field, InputType } from 'type-graphql' import UserSettingsType from '../graphql/user.settings.type' @InputType() export class NewUserInput { @Field() @IsEmail() email: string @Field((type) => UserSettingsType) @IsOptional() @IsArray() settings: {} } 的最佳做法),并将其分配为User模型以及new-user DTO类中的一种类型。为nest.js引发错误(不适用于模型),如果我将其更改为类似[String]而不是UserSettingsType的错误,则正在编译。

我不确定您是否需要此实际问题的解析器或服务/ mangoose逻辑,如果可以,我当然也可以发布它!

2 个答案:

答案 0 :(得分:12)

从Express迁移到nestjs也有类似的问题。

阅读docs后,意识到问题不是嵌套对象,而是错误的导入。

您应该使用@nestjs/graphql导入而不是type-graphql

E.G。

// changes this
import { Field, ID, ObjectType } from 'type-graphql'
// to
import { Field, ID, ObjectType } from '@nestjs/graphql'

type-graphql”中的其他任何导入均相同

答案 1 :(得分:0)

我遇到了同样的问题,使用巢状文档解决了,您必须创建标量类型,这是很久以前发布的,但是,希望对您有所帮助。

标量完成后,以这种方式声明您的字段:

class Api::V1::BaseSerializer < ActiveModel::Serializer

  ActiveModelSerializers.config.key_transform = :camel_lower

  def attributes(*_args)
    if self.class._attributes_data.empty?
      object.attributes.symbolize_keys
    else
      super
    end
  end

end

如果它是对象数组,请在SettingsScalar末尾添加[]。

https://docs.nestjs.com/graphql/scalars

也不要犹豫删除您的dist储存库和schema.gql,构建您的应用并运行它,不知道为什么,但是在执行此操作之前,我的架构似乎没有任何变化。