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:

npm install express express-graphql graphql

Configuració Bàsica

  1. 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 camp hello 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

  1. Instal·lació de Mongoose:
npm install mongoose
  1. 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);
  1. 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

  1. Afegir al Schema:
type Query {
  userByName(name: String!): User
}
  1. Afegir al Resolver:
userByName: async ({ name }) => await User.findOne({ name }),

Exercici 2: Crear una Mutation per Actualitzar l'Edat d'un Usuari

  1. Afegir al Schema:
type Mutation {
  updateUserAge(id: ID!, age: Int!): User
}
  1. 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

Mòdul 7: Bases de Dades i ORMs

Mòdul 8: Autenticació i Autorització

Mòdul 9: Proves i Depuració

Mòdul 10: Temes Avançats

Mòdul 11: Desplegament i DevOps

Mòdul 12: Projectes del Món Real

© Copyright 2024. Tots els drets reservats