Cómo escribir una API REST en TypeScript en 30 minutos: guía paso a paso
Crear una API REST es una tarea básica para cualquier desarrollador backend. El uso de TypeScript añade tipado estricto, mejora la legibilidad del código y reduce la cantidad de errores. En este artículo, analizaremos cómo escribir una API REST completa en TypeScript desde cero en solo 30 minutos. Conocerás Express, TypeORM y las mejores prácticas de organización del código.
1. Configuración del proyecto e instalación de dependencias
Primero, crea un nuevo directorio e inicializa el proyecto Node.js:
mkdir my-rest-apicd my-rest-apinpm init -yInstala los paquetes necesarios:
npm install express reflect-metadata typeorm sqlite3npm install -D typescript @types/node @types/express ts-node nodemonCrea el archivo tsconfig.json para la configuración de TypeScript:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "skipLibCheck": true }, "include": ["src/**/*"]}2. Creación de la estructura base y punto de entrada
Organiza la estructura de carpetas de la siguiente manera:
src/— código principalsrc/controllers/— controladoressrc/entities/— entidades de base de datossrc/routes/— rutas
Crea el archivo src/index.ts — punto de entrada de la aplicación:
import "reflect-metadata";import express from "express";import { AppDataSource } from "./data-source";import { userRoutes } from "./routes/userRoutes";
const app = express();const PORT = process.env.PORT || 3000;
app.use(express.json());
AppDataSource.initialize() .then(() => { console.log("Database connected"); app.use("/api/users", userRoutes); app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); }) .catch((error) => console.log(error));Ahora crea src/data-source.ts para la configuración de TypeORM:
import { DataSource } from "typeorm";import { User } from "./entities/User";
export const AppDataSource = new DataSource({ type: "sqlite", database: "database.sqlite", synchronize: true, logging: false, entities: [User],});3. Definición de la entidad y el controlador
Crea el archivo src/entities/User.ts — modelo de usuario:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id!: number;
@Column() name!: string;
@Column() email!: string;
@Column({ default: true }) isActive!: boolean;}Ahora crearemos el controlador src/controllers/userController.ts:
import { Request, Response } from "express";import { AppDataSource } from "../data-source";import { User } from "../entities/User";
const userRepository = AppDataSource.getRepository(User);
export const getUsers = async (req: Request, res: Response) => { try { const users = await userRepository.find(); res.json(users); } catch (error) { res.status(500).json({ message: "Error fetching users" }); }};
export const getUserById = async (req: Request, res: Response) => { try { const user = await userRepository.findOneBy({ id: parseInt(req.params.id) }); if (!user) { return res.status(404).json({ message: "User not found" }); } res.json(user); } catch (error) { res.status(500).json({ message: "Error fetching user" }); }};
export const createUser = async (req: Request, res: Respo