来自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逻辑,如果可以,我当然也可以发布它!
答案 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,构建您的应用并运行它,不知道为什么,但是在执行此操作之前,我的架构似乎没有任何变化。