Accueil / Articles / API express sécurisées par type avec Zod et OpenAPI dans un seul contrat

API express sécurisées par type avec Zod et OpenAPI dans un seul contrat

Validez les requêtes au niveau de l’edge et générez du OpenAPI à partir des mêmes schémas afin que les documents ne diffèrent jamais.

746 mots

Ce guide permet de reconstruire une approche fonctionnelle pour : créer une API Express sécurisée en termes de types à l’aide de Zod et d’OpenAPI. L’accent est mis sur les contrats, les vérifications, ainsi que sur du code que l’on peut intégrer directement dans un dépôt sans devoir deviner son intention. Pour une vue d’ensemble, définissez les entrées, le responsable de l’étape et les critères d’achèvement avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu, sans avoir à deviner l’état caché. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé.

L’idée

Pour cette idée, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez les terminaisons partielles silencieuses. Validez aux limites à l’aide de schémas qui génèrent également des documents. Une source unique de vérité évite les divergences entre OpenAPI et les gestionnaires.

const CreateUserSchema = z.object({
  name: z.string(),
  email: z.string().email(),
});

api.post("/users", {
  body: CreateUserSchema,
  response: {
    201: UserSchema,
  },
  handler: async (req) => {
    const user = await createUser(req.body);
    return {
      status: 201,
      body: user,
    };
  },
});

Pourquoi créer une autre bibliothèque Express ?

Pour « Pourquoi construire une autre bibliothèque Express ? », il faut définir les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrer les temps d’exécution et les coûts à côté des résultats fonctionnels. Une visibilité précoce évite des factures inattendues lorsque le parcours passe de l’environnement de démonstration à des environnements partagés. Valider aux limites avec des schémas qui génèrent également de la documentation. Une source unique de vérité est préférable aux écarts entre OpenAPI et les gestionnaires.

Où en est-on aujourd’hui

Pour « Où en est-on aujourd’hui », il faut définir les entrées, le responsable de l’étape et les critères de sortie avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Conservez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les flags fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans avoir à lire l’ensemble du système. Validez aux frontières à l’aide de schémas qui génèrent également des documents. Une source unique de vérité évite les divergences entre OpenAPI et les traitements. Pour « Où en est-on aujourd’hui », il faut définir les entrées, le responsable de l’étape et les critères de sortie avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un pipeline embrouillé.

Vous apprécierez les retours des développeurs

Pour que vous appréciiez les retours des développeurs, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définissez des vérifications de succès et refusez toute exécution partielle silencieuse. Retournez des erreurs structurées sur lesquelles les clients peuvent s’appuyer. Une typisation stricte des échecs force à deviner.

Liste de contrôle opérationnelle

Pour la liste de contrôle opérationnelle, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché.

Dokumentez ensemble le parcours normal et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations apportées ultérieurement.

Renvoyez des erreurs structurées sur lesquelles les clients peuvent s’appuyer. Une typisation stricte des échecs oblige à deviner la cause.

Préférez une fiabilité banale à des démonstrations ingénieuses ponctuelles.

Préférez de petites unités testables à des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une seule responsabilité plutôt qu’un processus embrouillé.

Renvoyez des erreurs structurées sur lesquelles les clients peuvent s’appuyer. Une typisation stricte des échecs oblige à deviner la cause.

Au préalable de promouvoir cette stack, figez les versions, conservez un enregistrement idéal du parcours critique et confirmez les étapes de rollback. Les environnements partagés nécessitent des limites de fréquence, des vérifications de location et un responsable clair pour la rotation des secrets. Préférez une fiabilité banale à des démonstrations ingénieuses ponctuelles.