Aller au contenu

Routage

Lacis génère les routes automatiquement depuis votre répertoire routes/. Chaque fichier index.ts dans ce répertoire devient un endpoint — aucune déclaration manuelle n’est nécessaire.

Placez vos fichiers de routes sous routes/. La hiérarchie des dossiers correspond directement aux chemins URL.

  • Répertoireroutes/
    • index.ts → GET /
    • Répertoireusers/
      • index.ts → /users
      • Répertoire[id]/
        • index.ts → /users/:id
    • Répertoireposts/
      • index.ts → /posts
      • Répertoire[slug]/
        • index.ts → /posts/:slug

Exportez des fonctions nommées correspondant aux méthodes HTTP en majuscules. Chaque export gère cette méthode pour l’URL du fichier.

// routes/users/index.ts → /users
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
res.json({ users: [] })
}
export async function POST(req: Request, res: Response) {
const body = await req.json()
res.status(201).json({ created: body })
}
export async function PUT(req: Request, res: Response) {
const body = await req.json()
res.json({ updated: body })
}
export async function PATCH(req: Request, res: Response) {
const body = await req.json()
res.json({ patched: body })
}
export async function DELETE(req: Request, res: Response) {
res.status(204).send('')
}

Méthodes supportées : GET, POST, PUT, PATCH, DELETE.

Entourez un nom de répertoire de crochets pour en faire un paramètre d’URL. Le nom du paramètre est le texte entre les crochets.

  • Répertoireroutes/
    • Répertoireusers/
      • Répertoire[id]/
        • index.ts → /users/:id
    • Répertoireorgs/
      • Répertoire[orgId]/
        • Répertoireteams/
          • Répertoire[teamId]/
            • index.ts → /orgs/:orgId/teams/:teamId

Accédez aux paramètres via req.params :

// routes/users/[id]/index.ts → /users/:id
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
const { id } = req.params
res.json({ id })
}

Imbriquez des répertoires pour créer des chemins URL imbriqués. Chaque niveau peut avoir son propre index.ts avec des handlers indépendants.

  • Répertoireroutes/
    • Répertoireapi/
      • index.ts → /api
      • Répertoireusers/
        • index.ts → /api/users
        • Répertoire[id]/
          • index.ts → /api/users/:id
          • Répertoireposts/
            • index.ts → /api/users/:id/posts
// routes/api/users/[id]/posts/index.ts → /api/users/:id/posts
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
const { id } = req.params
res.json({ userId: id, posts: [] })
}

Utilisez un répertoire nommé [...] pour capturer tous les segments de chemin restants.

  • Répertoireroutes/
    • Répertoirefiles/
      • Répertoire[…path]/
        • index.ts → /files/*
// routes/files/[...path]/index.ts
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
const filePath = req.params.path
res.json({ path: filePath })
}

Quand une route existe mais que la requête utilise une méthode HTTP non déclarée, Lacis retourne 405 Method Not Allowed et ajoute automatiquement un header Allow listant les méthodes supportées.

// routes/index.ts → GET /
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
res.json({ name: 'My API', version: '1.0.0' })
}
// routes/users/index.ts → /users
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
res.json({ users: [] })
}
export async function POST(req: Request, res: Response) {
const body = await req.json<{ name: string; email: string }>()
res.status(201).json({ id: crypto.randomUUID(), ...body })
}
// routes/users/[id]/index.ts → /users/:id
import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) {
const { id } = req.params
res.json({ id, name: 'Alice' })
}
export async function DELETE(req: Request, res: Response) {
res.status(204).send('')
}