クラスとデコレーターを使用して、TypeScriptを使用してGraphQLスキーマとリゾルバーを作成します!
https://typegraphql.com
TypeGraphQLは、GraphQL APIの開発を楽しいプロセスにします。つまり、クラスと少しのデコレーターマジックのみを使用してスキーマを定義します。
したがって、オブジェクトタイプや入力タイプなどのタイプを作成するには、DTOクラスの一種を使用します。たとえば、 Recipe種類を宣言するには、クラスを作成してデコレータで注釈を付けます。
@ ObjectType ( )
class Recipe {
@ Field ( type => ID )
id : string ;
@ Field ( )
title : string ;
@ Field ( type => [ Rate ] )
ratings : Rate [ ] ;
@ Field ( { nullable : true } )
averageRating ?: number ;
}そして、SDLのスキーマの対応する部分を取得します。
type Recipe {
id : ID !
title : String !
ratings : [ Rate ! ] !
averageRating : Float
}その後、クエリ、突然変異、フィールドリゾルバーを作成できます。この目的のために、慣習により「リゾルバー」と呼ばれるコントローラーのようなクラスを使用します。また、依存噴射や認証ガードなどの素晴らしい機能を使用することもできます。
@ Resolver ( Recipe )
class RecipeResolver {
// dependency injection
constructor ( private recipeService : RecipeService ) { }
@ Query ( returns => [ Recipe ] )
recipes ( ) {
return this . recipeService . findAll ( ) ;
}
@ Mutation ( )
@ Authorized ( Roles . Admin ) // auth guard
removeRecipe ( @ Arg ( "id" ) id : string ) : boolean {
return this . recipeService . removeById ( id ) ;
}
@ FieldResolver ( )
averageRating ( @ Root ( ) recipe : Recipe ) {
return recipe . ratings . reduce ( ( a , b ) => a + b , 0 ) / recipe . ratings . length ;
}
}そして、この簡単な方法では、SDLのスキーマのこの部分を取得します。
type Query {
recipes : [ Recipe ! ] !
}
type Mutation {
removeRecipe ( id : String ! ): Boolean !
}私たちは皆、GraphQLが優れていることを知っており、過剰フェッチや過小評価など、REST APIで抱えている多くの問題を解決します。ただし、typeScriptを使用してnode.jsでgraphql apiを開発するのは、少し痛いことがあります。なぜ?私たちが通常とらなければならない手順を見てみましょう。
まず、SDLを使用してschema.graphqlですべてのGraphQLタイプを作成します。次に、DBエンティティを表すORMクラスを使用してデータモデルを作成します。次に、クエリ、突然変異、フィールドのリゾルバーを作成し始めますが、これにより、すべての引数、入力、さらにはオブジェクトタイプのTSインターフェイスを最初に作成する必要があります。
その場合にのみ、奇妙なジェネリックシグネチャを使用してリソースバーを実装し、検証、承認、ロード依存関係などの一般的なタスクを手動で実行できます。
export const getRecipesResolver : GraphQLFieldResolver < void , Context , GetRecipesArgs > = async (
_ ,
args ,
ctx ,
) => {
// common tasks repeatable for almost every resolver
const repository = TypeORM . getRepository ( Recipe ) ;
const auth = Container . get ( AuthService ) ;
await joi . validate ( getRecipesSchema , args ) ;
if ( ! auth . check ( ctx . user ) ) {
throw new NotAuthorizedError ( ) ;
}
// our business logic, e.g.:
return repository . find ( { skip : args . offset , take : args . limit } ) ;
} ;最大の問題は、コードベースの冗長性であるため、物事を同期させることが困難です。エンティティに新しいフィールドを追加するには、すべてのファイルをジャンプする必要があります。エンティティクラス、スキーマ、インターフェイスを変更する必要があります。同じことが入力や議論にも当てはまります。 1つのピースを更新したり、単一のタイプで間違えたりするのを忘れがちです。また、フィールド名でタイプミスを行った場合はどうなりますか?変更機能(F2)は正しく機能しません。
GraphQLコードジェネレーターやGraphQLGenなどのツールは、最初の部分のみを解決します。GraphQLスキーマの対応するインターフェイス(およびリゾルバースケルトン)を生成しますが、スキーマ<->モデルの冗長性と開発者エクスペリエンスを修正しません(F2の名前の変更は機能しません。
TypeGraphQlは、TypeScriptのGraphQL APIの開発の数年の経験に基づいて、これらの問題に対処するようになります。主なアイデアは、クラスを使用してスキーマを定義し、デコレーターからの助けを借りて、真実の源を1つだけ持っていることです。依存関係の注入、検証、AUTHガードなどの追加機能は、通常、自分自身を処理する必要がある一般的なタスクに役立ちます。
APIとそのすべての機能のドキュメント、インストールガイド、および詳細な説明は、Webサイトで入手できます。
シンプルなウォークスルー(チュートリアル)を備えた完全な開始ガイドは、開始ドキュメントで見つけることができます。
ビデオチュートリアルを好む場合は、YouTubeでBen AwadのTypeGraphQLビデオシリーズを見ることができます。
また、このリポジトリの例フォルダーを確認して、単純なフィールドリゾルバー、DIコンテナサポート、Typeorm統合、自動検証など:より多くの使用例については、このリポジトリのフォルダーを確認することもできます。
テストフォルダーは、さまざまなことを成し遂げる方法に関するいくつかのヒントも提供する場合があります。
セキュリティの脆弱性を報告するには、Tideliftセキュリティの連絡先を使用してください。 Tideliftは、修正と開示を調整します。
現在リリースされたバージョンは、安定した1.0.0リリースです。よくテストされており(97%のカバレッジ、〜500のテストケース)、計画された機能のほとんどが既に実装されています。多くの企業や独立した開発者が、成功を収めて生産でそれを使用しています。
ただし、Better Typeorm、Prisma、Dataloaderの統合、カスタムデコレーター、メタデータアノテーションサポートなど、より多くの機能もあります。アイデアの完全なリストは、GitHubリポジトリで入手できます。また、プロジェクトボードでの開発の進捗状況を追跡することもできます。
興味深い機能リクエストがある場合は、GitHubで問題を開いてください。
TypeGraphQLは、MITライセンスのオープンソースプロジェクトです。このフレームワークは、眠れぬ夜、忙しい夜、週末など、途方もない量の仕事の結果です。
その背後にある大企業はありません。その進行中の開発は、コミュニティのサポートのおかげでのみ可能です。
ゴールドスポンサーになり、コア貢献者からプレミアム技術サポートを取得することにより、このオープンソースプロジェクトをサポートするよう依頼してください。
コミュニティ
助けたいですか?バグを提出したり、コードを寄付したり、ドキュメントを改善したりしたいですか?素晴らしい!貢献するためのガイドラインを読んでから、私たちの助けを求めている問題の1つをチェックしてください。 拡大する
追加情報
関連アプリ
おすすめ
関連情報
すべて
|
|---|