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
ageen 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
