GraphQL-Bibliothek TypeScript: Moderner Ansatz für APIs
GraphQL ist eine Abfragesprache für APIs, die es Clients ermöglicht, nur die benötigten Daten anzufordern. In Kombination mit TypeScript bietet es ein leistungsstarkes Typsystem, das Sicherheit und Autovervollständigung gewährleistet. Auf pythonlib.ru analysieren wir die wichtigste Bibliothek für die Arbeit mit GraphQL in TypeScript — type-graphql, sowie Alternativen.
Warum TypeScript + GraphQL?
TypeScript fügt statische Typisierung hinzu, was für große Projekte entscheidend ist. Ein über TypeScript-Klassen beschriebenes GraphQL-Schema wird zur einzigen Quelle der Wahrheit: Änderungen im Code werden automatisch mit der API synchronisiert. Dies schließt Abweichungen zwischen der Dokumentation und dem tatsächlichen Serververhalten aus.
Hauptbibliothek: TypeGraphQL
type-graphql ist ein Framework zur Erstellung von GraphQL-APIs in TypeScript unter Verwendung von Dekorateuren. Es folgt dem Prinzip des Code-First: Sie definieren das Schema über Code, nicht über SDL (Schema Definition Language).
Installation
npm install type-graphql graphql reflect-metadataFügen Sie in tsconfig.json hinzu:
{ "emitDecoratorMetadata": true, "experimentalDecorators": true}Beispiel: Definition eines Typs und Resolvers
Erstellen wir ein einfaches Benutzermodell und einen Resolver zum Abrufen von Daten.
import { ObjectType, Field, ID, Resolver, Query } from "type-graphql";
@ObjectType()class User { @Field(() => ID) id: number;
@Field() name: string;
@Field({ nullable: true }) email?: string;}
@Resolver()class UserResolver { @Query(() => [User]) users(): User[] { return [ { id: 1, name: "Anna", email: "anna@example.com" }, { id: 2, name: "Boris", email: null } ]; }}Erstellung und Start des Servers
import { buildSchema } from "type-graphql";import { ApolloServer } from "@apollo/server";import { startStandaloneServer } from "@apollo/server/standalone";
async function main() { const schema = await buildSchema({ resolvers: [UserResolver] });
const server = new ApolloServer({ schema }); const { url } = await startStandaloneServer(server, { listen: { port: 4000 } }); console.log(`Server gestartet: ${url}`);}
main();Alternative Bibliotheken
- NestJS + GraphQL — Integration mit dem beliebten Framework. Verwendet
@nestjs/graphqlbasierend auftype-graphql. - GraphQL Nexus — Code-First-Bibliothek ohne Dekorateure, verwendet Methodenverkettung.
- Pothos GraphQL — Moderne Code-First-Bibliothek mit hervorragender TypeScript-Unterstützung.
Erweiterte Funktionen von TypeGraphQL
Argumente und Mutationen
import { Arg, Mutation } from "type-graphql";
@Resolver()class UserResolver { @Mutation(() => User) createUser(@Arg("name") name: string, @Arg("email") email: string): User { return { id: 3, name, email }; }}Validierung mit class-validator
import { Length, IsEmail } from "class-validator";import { InputType, Field } from "type-graphql";
@InputType()class CreateUserInput { @Field() @Length(2, 30) name: string;
@Field() @IsEmail() email: string;}Autorisierung über Middleware
import { UseMiddleware } from "type-graphql";
function AuthMiddleware(): MiddlewareFn { return async ({ context }, next) => { if (!context.user) throw new Error("Nicht autorisiert"); return next(); };}
@Resolver()class UserResolver { @Query(() => User) @UseMiddleware(AuthMiddleware) me(): User { return { id: 1, name: "Aktueller Benutzer", email: "user@example.com" }; }}