Erstellen Sie das GraphQL -Schema und Resolver mit TypeScript mit Klassen und Dekoratoren!
https://typegraphql.com
Typegraphql macht die Entwicklung von GraphQL -APIs zu einem angenehmen Prozess, dh durch Definieren des Schemas mit nur Klassen und ein bisschen Dekorateur Magic.
Um Typen wie Objekttyp oder Eingabetyp zu erstellen, verwenden wir eine Art DTO -Klasse. Zum Beispiel, um Recipe zu deklarieren, erstellen wir einfach eine Klasse und kommentieren sie mit Dekoratoren:
@ ObjectType ( )
class Recipe {
@ Field ( type => ID )
id : string ;
@ Field ( )
title : string ;
@ Field ( type => [ Rate ] )
ratings : Rate [ ] ;
@ Field ( { nullable : true } )
averageRating ?: number ;
}Und wir bekommen den entsprechenden Teil des Schemas in SDL:
type Recipe {
id : ID !
title : String !
ratings : [ Rate ! ] !
averageRating : Float
}Anschließend können wir Abfragen, Mutationen und Feld Resolver erstellen. Zu diesem Zweck verwenden wir Controller-ähnliche Klassen, die als "Resolver" durch Konvention bezeichnet werden. Wir können auch großartige Funktionen wie Abhängigkeitsinjektion und Auth Guards verwenden:
@ 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 ;
}
}Und auf diese einfache Weise erhalten wir diesen Teil des Schemas in SDL:
type Query {
recipes : [ Recipe ! ] !
}
type Mutation {
removeRecipe ( id : String ! ): Boolean !
}Wir alle wissen, dass GraphQL großartig ist und viele Probleme löst, die wir mit REST-APIs haben, wie Überrückung und Unterabnahme. Die Entwicklung einer GraphQL -API in Node.js mit Typenkript ist jedoch manchmal ein bisschen Schmerz. Warum? Schauen wir uns die Schritte an, die wir normalerweise unternehmen müssen.
Zunächst erstellen wir alle GraphQL -Typen in schema.graphql mit SDL. Anschließend erstellen wir unsere Datenmodelle mit ORM -Klassen, die unsere DB -Entitäten darstellen. Dann schreiben wir Resolver für unsere Abfragen, Mutationen und Felder, aber dies zwingt uns, zuerst TS -Schnittstellen für alle Argumente, Eingaben und sogar Objekttypen zu erstellen.
Nur dann können wir die Resolver mit seltsamen generischen Signaturen implementieren und gemeinsame Aufgaben manuell ausführen, z. B. Validierung, Autorisierung und Ladeabhängigkeiten:
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 } ) ;
} ;Das größte Problem ist die Redundanz in unserer Codebasis, was es schwierig macht, die Dinge synchron zu halten. Um unserem Entität ein neues Feld hinzuzufügen, müssen wir alle Dateien durchspringen - eine Entitätsklasse, das Schema sowie die Schnittstelle ändern. Gleiches gilt für Eingaben oder Argumente. Es ist leicht zu vergessen, ein Stück zu aktualisieren oder einen Fehler mit einem einzigen Typ zu machen. Was ist, wenn wir im Feldnamen einen Tippfehler erstellt haben? Die Umbenennungsfunktion (F2) funktioniert nicht richtig.
Tools wie GraphQL-Codegenerator oder GraphQLGen Lösen Sie nur den ersten Teil-sie generieren die entsprechenden Schnittstellen (und Resolver-Skelette) für unser GraphQL-Schema, aber sie reparieren nicht die Redundanz von Schemas und Entwicklererfahrungen (F2-Umbenennungen werden nicht funktionieren, Sie müssen sich an die Codegen-Uhren-Uhr-Aufgabe usw. usw. usw. usw. usw. usw. usw. usw. usw. usw. usw. erinnern.
TypeGraphQL wird diese Probleme berücksichtigt, basierend auf Erfahrungen aus einigen Jahren der Entwicklung von GraphQL -APIs in TypeScript. Die Hauptidee besteht darin, nur eine Quelle der Wahrheit zu haben, indem das Schema mit Klassen und einigen Hilfe von Dekoratoren definiert wird. Zusätzliche Merkmale wie Abhängigkeitsinjektion, Validierung und Authuards helfen bei gemeinsamen Aufgaben, die wir normalerweise mit uns selbst bewältigen müssten.
Die Dokumentation, der Installationshandbuch und die detaillierte Beschreibung der API und alle Funktionen finden Sie auf der Website.
Ein vollständiger Anleitung für den Einstieg mit einer einfachen Walkthrough (Tutorial) finden Sie beim Einstiegsdocs.
Wenn Sie Video -Tutorials bevorzugen, können Sie Ben Awads Typegraphql -Videoreihe auf YouTube sehen.
Weitere Beispiele für die Nutzung können Sie auch den Beispiel -Ordner in diesem Repository überprüfen: einfache Felder -Resolver, DI -Containerunterstützung, Typormintegration, automatische Validierung usw.
Der Test -Ordner gibt Ihnen möglicherweise auch einige Tipps, wie Sie verschiedene Dinge erledigen können.
Um eine Sicherheitsanfälligkeit zu melden, verwenden Sie bitte den Tidelift -Sicherheitskontakt. TIDELIFT koordiniert die Korrektur und Offenlegung.
Die aktuell veröffentlichte Version ist eine stabile Veröffentlichung von 1.0.0. Es ist gut getestet (97% Abdeckung, ~ 500 Testfälle) und verfügt über die meisten bereits implementierten geplanten Funktionen. Viele Unternehmen und unabhängige Entwickler nutzen es mit Erfolg in Produktion.
Es gibt jedoch auch Pläne für viel mehr Funktionen wie Better TypeOrM, Prisma und Dataloader -Integration, benutzerdefinierte Dekorateure und Metadatenanmerkungen - die vollständige Liste der Ideen finden Sie im GitHub -Repo. Sie können auch den Fortschritt der Entwicklung im Projektboard im Auge behalten.
Wenn Sie interessante Feature -Anfragen haben, können Sie ein Problem auf Github eröffnen, damit wir das besprechen können!
TypeGraphql ist ein MIT-lizenziertes Open-Source-Projekt. Dieser Rahmen ist ein Ergebnis der enormen Arbeit - schlaflose Nächte, geschäftigen Abende und Wochenenden.
Es hat kein großes Unternehmen, das sich dahinter befindet - seine fortlaufende Entwicklung ist nur dank der Unterstützung der Community möglich.
Bitte bitten Sie Ihr Unternehmen, dieses Open -Source -Projekt zu unterstützen, indem Sie Goldsponsor werden und einen erstklassigen technischen Support von unseren Kernmitgliedern erhalten.