Ejemplos de Fox Framework
Esta sección contiene ejemplos prácticos que muestran cómo implementar diferentes características y patrones utilizando Fox Framework.
API RESTful Básica
Un ejemplo simple de API RESTful con controladores, rutas y middleware.
// src/controllers/todo.controller.ts
import { Request, Response } from 'express';
export class TodoController {
private todos = [
{ id: 1, title: 'Aprender Fox Framework', completed: false },
{ id: 2, title: 'Crear un API REST', completed: false }
];
getAll = (_req: Request, res: Response): void => {
res.json(this.todos);
};
getById = (req: Request, res: Response): void => {
const id = parseInt(req.params.id);
const todo = this.todos.find(t => t.id === id);
if (!todo) {
res.status(404).json({ error: 'Todo not found' });
return;
}
res.json(todo);
};
create = (req: Request, res: Response): void => {
const { title } = req.body;
if (!title) {
res.status(400).json({ error: 'Title is required' });
return;
}
const newTodo = {
id: this.todos.length + 1,
title,
completed: false
};
this.todos.push(newTodo);
res.status(201).json(newTodo);
};
update = (req: Request, res: Response): void => {
const id = parseInt(req.params.id);
const todoIndex = this.todos.findIndex(t => t.id === id);
if (todoIndex === -1) {
res.status(404).json({ error: 'Todo not found' });
return;
}
this.todos[todoIndex] = { ...this.todos[todoIndex], ...req.body };
res.json(this.todos[todoIndex]);
};
delete = (req: Request, res: Response): void => {
const id = parseInt(req.params.id);
const todoIndex = this.todos.findIndex(t => t.id === id);
if (todoIndex === -1) {
res.status(404).json({ error: 'Todo not found' });
return;
}
const deletedTodo = this.todos.splice(todoIndex, 1)[0];
res.json(deletedTodo);
};
}// src/routes/todo.routes.ts
import { Router } from 'express';
import { TodoController } from '../controllers/todo.controller';
const todoRouter = Router();
const todoController = new TodoController();
todoRouter.get('/todos', todoController.getAll);
todoRouter.get('/todos/:id', todoController.getById);
todoRouter.post('/todos', todoController.create);
todoRouter.put('/todos/:id', todoController.update);
todoRouter.delete('/todos/:id', todoController.delete);
export default todoRouter;// src/server/index.ts
import express from 'express';
import { FoxFactory } from '@foxframework/core';
import todoRouter from '../routes/todo.routes';
const app = express();
app.use(express.json());
const fox = new FoxFactory(app);
// Health endpoint (via FoxFactory)
fox.get('/', (_req, res) => {
res.json({ name: 'todo-api', version: '1.0.0' });
});
// Register routes
app.use('/api', todoRouter);
const PORT = Number(process.env.PORT) || 3000;
app.listen(PORT, () => {
console.log(`🦊 Todo API running on http://localhost:${PORT}`);
});Aplicación con Cache System
Este ejemplo muestra cómo implementar un sistema de caché para mejorar el rendimiento:
// src/controllers/product.controller.ts
import { Request, Response } from 'express';
// Simple in-memory cache (use @foxframework/db-redis for production)
const cache = new Map<string, { data: any; expiresAt: number }>();
function cacheGet<T>(key: string): T | null {
const entry = cache.get(key);
if (!entry || entry.expiresAt < Date.now()) {
cache.delete(key);
return null;
}
return entry.data as T;
}
function cacheSet(key: string, data: any, ttlSeconds = 3600): void {
cache.set(key, { data, expiresAt: Date.now() + ttlSeconds * 1000 });
}
export class ProductController {
async getProducts(_req: Request, res: Response): Promise<void> {
const cacheKey = 'products:all';
const cachedProducts = cacheGet<any[]>(cacheKey);
if (cachedProducts) {
console.log('Returning products from cache');
res.json(cachedProducts);
return;
}
console.log('Fetching products from database');
const products = await this.fetchProductsFromDB();
cacheSet(cacheKey, products);
res.json(products);
}
private async fetchProductsFromDB(): Promise<any[]> {
await new Promise(resolve => setTimeout(resolve, 500));
return [
{ id: 1, name: 'Laptop', price: 999.99 },
{ id: 2, name: 'Smartphone', price: 699.99 },
{ id: 3, name: 'Headphones', price: 199.99 }
];
}
}Vea más ejemplos completos en nuestro repositorio de ejemplos en GitHub (opens in a new tab).