Un CRUD (Create, Read, Update, Delete) en el contexto de GraphQL se refiere a las operaciones básicas para gestionar datos a través de una API GraphQL. A continuación, se presenta una guía sobre cómo implementar cada una de estas operaciones utilizando GraphQL.
GraphQL es un lenguaje de consultas para APIs desarrollado por Facebook que permite a los clientes solicitar exactamente los datos que necesitan. A diferencia de REST, GraphQL utiliza un único endpoint y permite operaciones más flexibles y eficientes.
Operación CRUD | Operación GraphQL | Descripción |
---|---|---|
Create | Mutation | Crear un nuevo recurso. |
Read | Query | Obtener uno o varios recursos. |
Update | Mutation | Actualizar un recurso existente. |
Delete | Mutation | Eliminar un recurso existente. |
A continuación, se muestra un ejemplo de cómo implementar un CRUD en GraphQL utilizando Node.js con el framework Apollo Server y MongoDB como base de datos NoSQL.
Primero, asegúrate de tener Node.js y MongoDB instalados en tu sistema. Luego, crea un nuevo proyecto e instala las dependencias necesarias:
npm init -y
npm install apollo-server graphql mongoose
// schema.js
const { gql } = require('apollo-server');
const typeDefs = gql`
type Usuario {
id: ID!
nombre: String!
email: String!
edad: Int!
}
type Query {
obtenerUsuarios: [Usuario]
obtenerUsuario(id: ID!): Usuario
}
type Mutation {
crearUsuario(nombre: String!, email: String!, edad: Int!): Usuario
actualizarUsuario(id: ID!, nombre: String, email: String, edad: Int): Usuario
eliminarUsuario(id: ID!): Usuario
}
`;
module.exports = typeDefs;
// resolvers.js
const Usuario = require('./models/Usuario');
const resolvers = {
Query: {
obtenerUsuarios: async () => {
try {
return await Usuario.find();
} catch (error) {
throw new Error('Error al obtener usuarios');
}
},
obtenerUsuario: async (_, { id }) => {
try {
return await Usuario.findById(id);
} catch (error) {
throw new Error('Error al obtener el usuario');
}
},
},
Mutation: {
crearUsuario: async (_, { nombre, email, edad }) => {
const nuevoUsuario = new Usuario({ nombre, email, edad });
return await nuevoUsuario.save();
},
actualizarUsuario: async (_, { id, nombre, email, edad }) => {
try {
return await Usuario.findByIdAndUpdate(
id,
{ nombre, email, edad },
{ new: true }
);
} catch (error) {
throw new Error('Error al actualizar el usuario');
}
},
eliminarUsuario: async (_, { id }) => {
try {
return await Usuario.findByIdAndDelete(id);
} catch (error) {
throw new Error('Error al eliminar el usuario');
}
},
},
};
module.exports = resolvers;
// models/Usuario.js
const mongoose = require('mongoose');
const UsuarioSchema = new mongoose.Schema({
nombre: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
},
edad: {
type: Number,
required: true,
},
});
module.exports = mongoose.model('Usuario', UsuarioSchema);
// server.js
const { ApolloServer } = require('apollo-server');
const mongoose = require('mongoose');
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const server = new ApolloServer({ typeDefs, resolvers });
const startServer = async () => {
try {
await mongoose.connect('mongodb://localhost:27017/crud_graphql', {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
});
console.log('MongoDB conectado');
await server.listen({ port: 4000 });
console.log('Servidor GraphQL corriendo en http://localhost:4000/');
} catch (error) {
console.error('Error al iniciar el servidor:', error);
}
};
startServer();
Puedes utilizar herramientas como GraphQL Playground (incluido en Apollo Server) para probar los endpoints de la API.
mutation {
crearUsuario(nombre: "Juan Pérez", email: "juan.perez@example.com", edad: 30) {
id
nombre
email
edad
}
}
query {
obtenerUsuarios {
id
nombre
email
edad
}
}
query {
obtenerUsuario(id: "60d5f483f8d2e814c8d0f123") {
id
nombre
email
edad
}
}
mutation {
actualizarUsuario(id: "60d5f483f8d2e814c8d0f123", email: "juan.nuevo@example.com") {
id
nombre
email
edad
}
}
mutation {
eliminarUsuario(id: "60d5f483f8d2e814c8d0f123") {
id
nombre
email
edad
}
}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod Lorem ipsum dolor sit amet.