Schema Generator 无法确定 DTO 中自定义对象的 GraphQL 输出类型

Posted

技术标签:

【中文标题】Schema Generator 无法确定 DTO 中自定义对象的 GraphQL 输出类型【英文标题】:Schema Generator cannot determine GraphQL output type for custom object within DTO 【发布时间】:2019-11-15 00:48:43 【问题描述】:

来自 laravel 背景,我尝试进入 node.js/graphQL/MongoDB 并偶然发现了看起来很不错的 nest.js 框架。所以我尝试建立一个简单的 GraphQL API 来测试和理解它是如何工作的。因此,我为用户创建了一个 mongoose Schema 以及一个模型 (type-graphql) 和一个 DTO 用于通过突变创建这样的用户。

这工作得很好,但后来我想在用户中添加一个名为 settings 的嵌套对象来尝试它是如何工作的,我根本不明白,也找不到任何 nest.jstype-graphql 特定的这种实现的例子。使用nest.js 的“代码优先”方法这根本不可行吗?因为模式生成器在编译时总是给我一个错误:

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

user.model.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: 

user.settings.type.ts

import  Field, ObjectType  from 'type-graphql'

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

  @Field()
  description?: string

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

新用户.input.ts

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: 


如您所见,我在一个单独的文件中定义了一个新类型 UserSettings(遵循 nest.js 的最佳实践)并将其分配为 User 模型和新用户 DTO 类中的一个类型。为DTO class 引发错误(不适用于模型),如果我将其更改为 [String] 而不是 UserSettingsType 它正在编译。

我不确定您是否需要解决程序或服务/猫鼬逻辑来解决这个实际问题,如果需要,我当然也可以发布!

【问题讨论】:

您好,您解决了这个问题吗?你能分享一些东西吗?当我尝试使用字符串数组进行输入时,我遇到了类似的问题。仍然不知道如何解决这个问题。 嗨!实际上,在遇到其他问题后,我也停止使用nest.js,并决定为我即将推出的框架使用其他技术。很抱歉,我无法为您提供帮助。 【参考方案1】:

从 express 迁移到 nestjs 时遇到类似问题。

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

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

例如

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

同样适用于来自type-graphql的任何其他导入

【讨论】:

如果我只使用 express 和 type-graphql 怎么办? 这解决了我在升级nestjs时遇到的类似问题。 与@theva 相同,必须将所有type-graphql 替换为@nestjs/graphql,生成的schema.gql 来自type-graphql 如果你不使用nestjs,我真的很想知道答案 当我忘记将@ObjectType() 添加到实体对象时发生在我身上。

以上是关于Schema Generator 无法确定 DTO 中自定义对象的 GraphQL 输出类型的主要内容,如果未能解决你的问题,请参考以下文章

graphql-code-generator 依据graphql schema自动生成客户端类型定义

GWT RPC:DTO 与 DAO?

嵌套错误:无法确定 getProducts 的 GraphQL 输出类型

例题3-5 Digit Generator UVA - 1583

为啥这个Schema为空.....如何在nestjs中设置@ApiProperty

使用带有 DTO 的 HttpPost,邮递员无法调用 tht 方法