web-dev-qa-db-ja.com

スキーマジェネレーターは、DTO内のカスタムオブジェクトのGraphQL出力タイプを決定できません

laravelバックグラウンドから来るので、node.js/graphQL/MongoDBにアクセスしようとしましたが、nest.jsフレームワークにぶつかりました。これは見栄えがいいので、単純なGraphQL APIを設定しようとしましたそのため、すべての機能をテストして理解するために、ユーザー用のマングーススキーマとモデル(type-graphql)と、ミューテーションを介してそのようなユーザーを作成するためのDTOを作成しました。

これはかなりうまくいきますが、ユーザーの設定にネストされたオブジェクトを追加して、これがどのように機能するかを試してみましたが、単に取得できず、nest.jsまたはtype-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[]
}

new-user.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(モデルではなく)に対してスローされ、そこでUserSettingsTypeではなく[String]のようなものに変更すると、コンパイルされます。

この実際の問題にリゾルバまたはサービス/マングースロジックが必要かどうかはわかりませんが、もちろんそれも投稿できます!

7
carsten

同様の問題が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からの他のインポートにも適用されます

1
T.Chmelevskij