En aquest tema, aprendrem a construir una aplicació full-stack utilitzant GraphQL. Aquest procés inclou la creació d'un servidor GraphQL, la connexió a una base de dades, la implementació de resolvers, i la construcció d'un client que consumeixi l'API GraphQL. Utilitzarem Node.js per al servidor i React amb Apollo Client per al client.
Objectius del tema
- Configurar un servidor GraphQL amb Node.js.
- Connectar el servidor a una base de dades.
- Implementar resolvers per a consultes i mutacions.
- Construir un client React que consumeixi l'API GraphQL.
Requisits previs
- Coneixements bàsics de JavaScript i Node.js.
- Familiaritat amb React.
- Coneixements bàsics de GraphQL.
Passos per construir l'aplicació full-stack
- Configuració del servidor GraphQL
Instal·lació de dependències
Primer, crearem un nou projecte Node.js i instal·larem les dependències necessàries.
mkdir fullstack-graphql cd fullstack-graphql npm init -y npm install express express-graphql graphql mongoose
Configuració del servidor
Crearem un fitxer server.js
per configurar el servidor GraphQL.
const express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); const mongoose = require('mongoose'); // Connexió a la base de dades mongoose.connect('mongodb://localhost:27017/fullstack', { useNewUrlParser: true, useUnifiedTopology: true }); // Definició de l'esquema const schema = buildSchema(` type Query { hello: String } `); // Definició dels resolvers const root = { hello: () => 'Hello, world!', }; // Configuració del servidor Express 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'));
- Connexió a una base de dades
Definició del model
Crearem un model de Mongoose per gestionar les dades. Per exemple, un model d'usuari.
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, }); const User = mongoose.model('User', userSchema); module.exports = User;
Actualització de l'esquema i resolvers
Actualitzarem l'esquema GraphQL per incloure operacions sobre els usuaris.
const { buildSchema } = require('graphql'); const User = require('./models/user'); const schema = buildSchema(` type User { id: ID! name: String! email: String! } type Query { users: [User] } type Mutation { addUser(name: String!, email: String!): User } `); const root = { users: async () => { return await User.find(); }, addUser: async ({ name, email }) => { const user = new User({ name, email }); await user.save(); return user; }, };
- Construcció del client React
Instal·lació de dependències
Crearem un nou projecte React i instal·larem Apollo Client.
Configuració d'Apollo Client
Configurarem Apollo Client per connectar-se al nostre servidor GraphQL.
// src/index.js import React from 'react'; import ReactDOM from 'react-dom'; import { ApolloProvider, InMemoryCache, ApolloClient } from '@apollo/client'; import App from './App'; const client = new ApolloClient({ uri: 'http://localhost:4000/graphql', cache: new InMemoryCache(), }); ReactDOM.render( <ApolloProvider client={client}> <App /> </ApolloProvider>, document.getElementById('root') );
Creació de components
Crearem components per mostrar i afegir usuaris.
// src/App.js import React from 'react'; import { useQuery, useMutation, gql } from '@apollo/client'; const GET_USERS = gql` query GetUsers { users { id name email } } `; const ADD_USER = gql` mutation AddUser($name: String!, $email: String!) { addUser(name: $name, email: $email) { id name email } } `; function App() { const { loading, error, data } = useQuery(GET_USERS); const [addUser] = useMutation(ADD_USER); if (loading) return <p>Loading...</p>; if (error) return <p>Error :(</p>; let nameInput, emailInput; return ( <div> <h1>Users</h1> <ul> {data.users.map(user => ( <li key={user.id}>{user.name} - {user.email}</li> ))} </ul> <form onSubmit={e => { e.preventDefault(); addUser({ variables: { name: nameInput.value, email: emailInput.value } }); nameInput.value = ''; emailInput.value = ''; }} > <input ref={node => { nameInput = node; }} placeholder="Name" /> <input ref={node => { emailInput = node; }} placeholder="Email" /> <button type="submit">Add User</button> </form> </div> ); } export default App;
Exercicis pràctics
Exercici 1: Afegir un camp d'edat als usuaris
- Actualitza el model d'usuari per incloure un camp
age
. - Actualitza l'esquema GraphQL per incloure el camp
age
en les consultes i mutacions. - Actualitza el client React per permetre l'entrada i visualització de l'edat dels usuaris.
Exercici 2: Implementar una mutació per eliminar usuaris
- Afegeix una mutació a l'esquema GraphQL per eliminar un usuari per ID.
- Implementa el resolver corresponent.
- Actualitza el client React per permetre l'eliminació d'usuaris.
Resum
En aquest tema, hem après a construir una aplicació full-stack utilitzant GraphQL. Hem configurat un servidor GraphQL amb Node.js, connectat a una base de dades, implementat resolvers, i construït un client React que consumeix l'API GraphQL. A més, hem proporcionat exercicis pràctics per reforçar els conceptes apresos.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL