Configuración Inicial
Para comenzar con Koa2, instale el paquete usando yarn o npm. A continuación, se muestra un ejemplo básico de configuración del servidor.
const Koa = require('koa');
const servidor = new Koa();
servidor.use(async (ctx, siguiente) => {
ctx.body = '¡Bienvenido al servidor Koa!';
await siguiente();
});
servidor.listen(3000, () => {
console.log('Servidor activo en el puerto 3000');
});
Generación de Proyectos con Plantillas
Utilice el generador de Koa2 para crear una estructura de proyecto base. Enstale globalmente el generador y cree un nuevo proyecto.
npm install -g koa2-generator
koa2 mi-proyecto-koa
Integre motores de plantillas como Pug para cotnenido dinámico. Primero, instale el paquete de Pug.
yarn add pug
Cree una plantilla en un archivo separado, por ejemplo vistas/index.pug, y configúrela en el servidor.
const Koa = require('koa');
const vistas = require('koa-views');
const { join } = require('path');
const servidor = new Koa();
servidor.use(vistas(join(__dirname, 'vistas'), {
extension: 'pug'
}));
servidor.use(async (ctx, siguiente) => {
await ctx.render('index', {
usuario: 'Ana'
});
});
servidor.listen(3000);
Gestión de Rutas
Implemente enrutamiento con koa-router para manejar diferentes endpoints. Instale el módulo y defina rutas.
yarn add koa-router
const Router = require('koa-router');
const enrutador = new Router();
enrutador.get('/productos', async (ctx) => {
ctx.body = 'Listado de productos';
});
enrutador.get('/productos/:id', async (ctx) => {
const idProducto = ctx.params.id;
ctx.body = `Detalle del producto: ${idProducto}`;
});
servidor.use(enrutador.routes()).use(enrutador.allowedMethods());
Separe las rutas en módulos independientes para mejor organización. Por ejemplo, cree un archivo rutas/productos.js y exporte el enrutador.
Procesamiento de Solicitudes
Para solicitudes GET, acceda a parámetros de consulta mediante ctx.query o ctx.request.query.
enrutador.get('/buscar', async (ctx) => {
const termino = ctx.query.termino;
ctx.body = `Resultados para: ${termino}`;
});
Para solicitudes POST, use koa-body para parsear el cuerpo de la solicitud.
yarn add koa-body
const koaBody = require('koa-body');
servidor.use(koaBody());
enrutador.post('/enviar', async (ctx) => {
const datos = ctx.request.body;
ctx.body = `Datos recibidos: ${JSON.stringify(datos)}`;
});
Recursos Estáticos
Sirva archivos estáticos como CSS, imágenes y JavaScript usando koa-static.
yarn add koa-static
const static = require('koa-static');
servidor.use(static(join(__dirname, 'publico')));
Manejo de Cookies y Sesiones
Administre cookeis con los métodos integrados de Koa. Para sesiones persistentes, utilice koa-session.
yarn add koa-session
const sesion = require('koa-session');
servidor.keys = ['secreto-clave'];
const configSesion = {
key: 'app:sid',
maxAge: 86400000,
httpOnly: true,
signed: true
};
servidor.use(sesion(configSesion, servidor));
enrutador.get('/visitas', async (ctx) => {
ctx.session.contador = (ctx.session.contador || 0) + 1;
ctx.body = `Contador de visitas: ${ctx.session.contador}`;
});
Integración con Bases de Datos
Conéctese a MongoDB usando el paquete nativo o Mongoose para un enfoque orientado a objetos.
yarn add mongoose
Defina un esquema y modelo en Mongoose.
const mongoose = require('mongoose');
const esquemaProducto = new mongoose.Schema({
nombre: String,
precio: Number
});
const ModeloProducto = mongoose.model('Producto', esquemaProducto);
Conecte a la base de datos y realice operaciones CRUD.
mongoose.connect('mongodb://localhost:27017/mi_base', {
useNewUrlParser: true,
useUnifiedTopology: true
});
enrutador.post('/agregar', async (ctx) => {
const nuevoProducto = new ModeloProducto(ctx.request.body);
await nuevoProducto.save();
ctx.body = 'Producto guardado';
});
Uso de Redis para Caché y Sesiones
Implemente Redis para mejorar el rendimiento con caché y manejo de sesiones. Instale los módulos necesarios.
yarn add koa-redis redis
Configure Redis como almacén de sesiones.
const Redis = require('koa-redis');
const adaptadorRedis = new Redis();
servidor.use(sesion({
store: adaptadorRedis,
key: 'sesion:redis'
}, servidor));
Acceda directamente al cliente Redis para operaciones de caché.
const clienteRedis = adaptadorRedis.client;
await clienteRedis.set('clave', 'valor');
const valor = await clienteRedis.get('clave');