GraphQL-Bibliothek für Node.js: Apollo Server und Entwicklungstools
GraphQL ist eine Abfragesprache für APIs, die es Clients ermöglicht, nur die Daten anzufordern, die sie benötigen. Für die Entwicklung mit Node.js ist die beliebteste Bibliothek Apollo Server. Sie bietet einen vollständigen Satz an Werkzeugen zum Erstellen, Testen und Bereitstellen von GraphQL-APIs. In diesem Artikel werden wir die wichtigsten Komponenten, Ansätze und Codebeispiele im Detail besprechen.
Was ist Apollo Server?
Apollo Server ist eine Open-Source-Bibliothek, mit der Sie schnell einen GraphQL-Server unter Node.js erstellen können. Sie unterstützt mehrere Transporte (HTTP, WebSocket) und lässt sich leicht in Frameworks (Express, Koa, Fastify) integrieren. Hauptfunktionen:
- Automatische Generierung der Dokumentation über GraphQL Playground.
- Unterstützung von Subscriptions über WebSocket.
- Mechanismus zum Caching und Zusammenführen von Daten (data loaders).
- Flexibles Middleware-System für Authentifizierung und Autorisierung.
Installation und grundlegende Einrichtung
Installieren Sie zunächst die Pakete apollo-server und graphql:
npm install apollo-server graphqlErstellen Sie einen einfachen Server, der eine Begrüßung zurückgibt:
const { ApolloServer, gql } = require('apollo-server');
// Schema definieren (SDL)const typeDefs = gql` type Query { hello: String }`;
// Resolver — Funktionen, die Daten zurückgebenconst resolvers = { Query: { hello: () => 'Hello, GraphQL!', },};
// Server startenconst server = new ApolloServer({ typeDefs, resolvers });server.listen().then(({ url }) => { console.log(`🚀 Server läuft unter ${url}`);});Datentypen und Schemas
In GraphQL definiert das Schema alle verfügbaren Typen und Operationen. Grundlegende Typen:
String,Int,Float,Boolean,ID— skalare Typen.[Type]— Liste von Objekten.type— benutzerdefiniertes Objekt.input— Typ für Eingabeparameter von Mutationen.
Beispielschema für einen Blog:
type User { id: ID! name: String! posts: [Post!]!}
type Post { id: ID! title: String! content: String! author: User!}
type Query { user(id: ID!): User posts(limit: Int): [Post!]!}
type Mutation { createUser(name: String!): User!}Resolver: Verbindung von Schema und Daten
Jedes Feld des Schemas muss einen entsprechenden Resolver haben. Resolver können Daten aus einer Datenbank (MongoDB, PostgreSQL), externen APIs oder statischen Arrays abrufen.
const users = [ { id: '1', name: 'Anna' }, { id: '2', name: 'Boris' },];
const posts = [ { id: '10', title: 'GraphQL für Anfänger', content: '...', authorId: '1' }, { id: '20', title: 'Node.js Tipps', content: '...', authorId: '2' },];
const resolvers = { Query: { user: (_, { id }) => users.find(u => u.id === id), posts: (_, { limit }) => limit ? posts.slice(0, limit) : posts, }, Mutation: { createUser: (_, { name }) => { const newUser = { id: String(users.length + 1), name }; users.push(newUser); return newUser; }, }, User: { posts: (parent) => posts.filter(p => p.authorId === parent.id), },};Code-First-Ansatz mit TypeGraphQL
Für größere Projekte ist der Code-First-Ansatz praktischer, bei dem das Schema aus TypeScript-Klassen generiert wird. Die Bibliothek type-graphql ermöglicht es, Code zu schreiben, der gleichzeitig Typ und Resolver ist.
npm install type-graphql reflect-metadata class-validatorBeispiel einer Entitätsklasse:
import { ObjectType, Field, Auch in der Bibliothek
Verwaltung der Konfiguration von TypeScript-Anwendungen: Vollständiger Leitfaden
Arbeiten mit Daten in Kotlin: Überblick über Bibliotheken und Werkzeuge
Arbeiten mit Bildern in PHP: resize, crop (Zuschneiden und Skalieren)
Tokio für Rust: Vollständige Anleitung mit Beispielen