Diviser un routeur Express monolithique en routes par domaine
Devin découpe un routeur Express de 2 000 lignes en fichiers de routes spécifiques à chaque domaine avec un middleware partagé — puis met à jour tous les imports et vérifie que tous les tests passent.Présentez le monolithe à Devin
Vous connaissez ce fichier : un seul routeur Express qui a grossi pendant dix-huit mois. Tous les endpoints pour tous les domaines se trouvent dans Dites à Devin exactement à quoi doit ressembler la structure cible.
src/routes/index.ts : l’inscription utilisateur à côté des webhooks de paiement, à côté de la recherche de produits. Les vérifications d’authentification en ligne sont copiées-collées dans 40 gestionnaires. Personne ne veut y toucher, car une modification de la logique des commandes pourrait casser les endpoints utilisateur trois cents lignes plus haut dans le fichier.Voici à quoi ressemble généralement le haut du fichier :src/routes/index.ts (before — 2,000 lines)
Guidez Devin à l’aide de conventions
Devin lit votre base de code pour en déduire des patterns, mais c’est lors de la refactorisation que les entrées Knowledge sont les plus utiles. Ajoutez des entrées pour les conventions que Devin doit suivre :
- Patterns de routeur — “Chaque routeur de domaine utilise
Router()et est monté avecapp.use('/domain', domainRouter)à la racine” - Middleware — “Le middleware d’authentification se trouve dans
src/middleware/et est toujours importé, jamais défini inline” - Gestion des erreurs — “Tous les gestionnaires de route utilisent notre wrapper
asyncHandlerdepuissrc/lib/asyncHandler.ts— jamais de try/catch direct”
src/routes/admin.ts, qui est déjà clairement séparé” à votre prompt.Vous pouvez également utiliser Advanced Devin pour générer des entrées Knowledge pour vous — décrivez simplement vos conventions et il créera des entrées bien structurées que vous pourrez relire et enregistrer.Examiner la PR de Devin
Devin cartographie tous les endpoints, suit le graphe d’import, extrait la logique partagée, crée les fichiers de domaine, rebranche le routeur racine et exécute votre suite de tests. Voici à quoi ressemble généralement la PR :Voici à quoi ressemble le routeur racine simplifié après la séparation :Et un fichier de routes de domaine où le middleware partagé est correctement importé :Chaque chemin d’URL reste identique —
src/routes/index.ts (after — 15 lines)
src/routes/orders.ts (after — excerpt)
/orders est désormais géré par ordersRouter, monté sur /orders, de sorte que les clients et les tests existants continuent de fonctionner sans changement.(Facultatif) Basculez sur la branche et testez en local
Pour une refactorisation structurelle de ce type, il est préférable de récupérer la branche et de vérifier en local avant de fusionner. Ouvrez le projet dans Windsurf ou dans votre IDE préféré, lancez l’application et appelez quelques endpoints pour confirmer que le routage, le middleware et la gestion des erreurs se comportent comme auparavant.Si quelque chose vous semble incorrect, laissez un commentaire sur la PR — Devin le prendra en compte et poussera un correctif.
