Introducció a GraphQL
GraphQL és un llenguatge de consulta per a APIs i un entorn d'execució per a les consultes amb les dades existents. Proporciona una manera més eficient, potent i flexible de treballar amb APIs en comparació amb REST.
Conceptes Clau de GraphQL
- Schema: Defineix la forma de les dades i les operacions disponibles.
- Query: Una consulta que permet obtenir dades.
- Mutation: Una operació que permet modificar dades.
- Resolver: Una funció que resol una consulta o mutació.
Configuració de GraphQL en un Projecte Node.js
Instal·lació de les Dependències Necessàries
Per començar a utilitzar GraphQL en un projecte Node.js, necessitarem instal·lar algunes dependències:
Configuració Bàsica
- Crear un fitxer
server.js
:
const express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); // Definir el schema const schema = buildSchema(` type Query { hello: String } `); // Definir els resolvers const root = { hello: () => { return 'Hello, world!'; }, }; const app = express(); app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, })); app.listen(4000, () => console.log('Servidor en funcionament a http://localhost:4000/graphql'));
Explicació del Codi
- Schema: Definim un tipus
Query
amb un camphello
que retorna una cadena de text. - Resolvers: Definim una funció
hello
que retorna el text "Hello, world!". - Express: Configurem un servidor Express que utilitza
express-graphql
per gestionar les peticions a/graphql
.
Definició de Schemas Complexos
Podem definir schemas més complexos amb múltiples tipus i relacions.
Exemple de Schema Complex
const schema = buildSchema(` type Query { user(id: ID!): User users: [User] } type User { id: ID name: String age: Int } `);
Resolvers per a Schemas Complexos
const users = [ { id: '1', name: 'Alice', age: 25 }, { id: '2', name: 'Bob', age: 30 }, ]; const root = { user: ({ id }) => users.find(user => user.id === id), users: () => users, };
Mutations en GraphQL
Les mutations permeten modificar dades.
Exemple de Mutation
const schema = buildSchema(` type Query { users: [User] } type Mutation { addUser(name: String!, age: Int!): User } type User { id: ID name: String age: Int } `); let users = [ { id: '1', name: 'Alice', age: 25 }, { id: '2', name: 'Bob', age: 30 }, ]; const root = { users: () => users, addUser: ({ name, age }) => { const user = { id: `${users.length + 1}`, name, age }; users.push(user); return user; }, };
Integració amb Bases de Dades
Podem integrar GraphQL amb bases de dades com MongoDB o SQL.
Exemple amb MongoDB
- Instal·lació de Mongoose:
- Configuració de Mongoose:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true }); const UserSchema = new mongoose.Schema({ name: String, age: Number, }); const User = mongoose.model('User', UserSchema);
- Resolvers amb Mongoose:
const root = { users: async () => await User.find(), addUser: async ({ name, age }) => { const user = new User({ name, age }); await user.save(); return user; }, };
Exercicis Pràctics
Exercici 1: Crear una Query per Obtenir un Usuari per Nom
- Afegir al Schema:
- Afegir al Resolver:
Exercici 2: Crear una Mutation per Actualitzar l'Edat d'un Usuari
- Afegir al Schema:
- Afegir al Resolver:
updateUserAge: async ({ id, age }) => { const user = await User.findById(id); user.age = age; await user.save(); return user; },
Resum
En aquesta secció, hem après els conceptes bàsics de GraphQL i com configurar-lo en un projecte Node.js. Hem vist com definir schemas, crear resolvers, treballar amb mutations i integrar GraphQL amb bases de dades com MongoDB. Els exercicis pràctics proporcionats ajuden a reforçar els conceptes apresos i a aplicar-los en situacions reals.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu