Comment écrire une API REST en TypeScript en 30 minutes : guide pas à pas
Créer une API REST est une tâche fondamentale pour tout développeur backend. L'utilisation de TypeScript ajoute un typage strict, améliore la lisibilité du code et réduit le nombre d'erreurs. Dans cet article, nous allons voir comment écrire une API REST complète en TypeScript à partir de zéro en seulement 30 minutes. Vous découvrirez Express, TypeORM et les meilleures pratiques d'organisation du code.
1. Configuration du projet et installation des dépendances
Commencez par créer un nouveau répertoire et initialisez le projet Node.js :
mkdir my-rest-apicd my-rest-apinpm init -yInstallez les paquets nécessaires :
npm install express reflect-metadata typeorm sqlite3npm install -D typescript @types/node @types/express ts-node nodemonCréez le fichier tsconfig.json pour la configuration de TypeScript :
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "skipLibCheck": true }, "include": ["src/**/*"]}2. Création de la structure de base et du point d'entrée
Organisez la structure des dossiers comme suit :
src/— code principalsrc/controllers/— contrôleurssrc/entities/— entités de la base de donnéessrc/routes/— routes
Créez le fichier src/index.ts — point d'entrée de l'application :
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));Créez maintenant src/data-source.ts pour la configuration 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. Définition de l'entité et du contrôleur
Créez le fichier src/entities/User.ts — modèle utilisateur :
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id!: number;
@Column() name!: string;
@Column() email!: string;
@Column({ default: true }) isActive!: boolean;}Créons maintenant le contrôleur 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: Response) => {