Traduction de la page originale en anglais. En cas de divergence, la version anglaise fait foi.
Erreurs et problem+json
Les erreurs sont des citoyennes de première classe dans DaloyJS. Chaque HttpError levée est sérialisée en RFC 9457 problem+json avec une URI type stable, un identifiant de requête et le Content-Type approprié.
- 01handlerthrow new NotFoundError(...)toute sous-classe de HttpError
- 02frameworkCorrespondance avec les champs RFC 9457type · title · status · detail
- 03productionMasquage du detail 5xxaffiché seulement si l’environnement est development ou test
- 04réseauRéponse sérialiséeapplication/problem+json + x-request-id
Classes d’erreur intégrées
TooManyRequestsError et ServiceUnavailableError valident retryAfterSeconds de la même façon : toute valeur autre qu’un entier sûr non négatif lève une RangeError à la construction, si bien qu’un NaN issu d’une variable d’environnement manquante ne devient jamais un en-tête Retry-After invalide. RequestTimeoutError (l’échéance requestTimeoutMs, voir requestTimeoutStatus, en anglais) est en no-store pour toutes ses variantes de statut depuis la 1.16.0 : un cache partagé ne continue donc jamais à servir un 503/504 une fois le backend rétabli. Un simple new HttpError(status, …) reçoit un type de problème https://httpstatuses.io/<status> ; les classes intégrées portent des URI stables https://daloyjs.dev/errors/<slug>.
Lever une erreur dans un handler
Format sur le réseau
L’identifiant de requête est renvoyé au client à deux endroits : l’en-tête de réponse x-request-id, et (selon RFC 9457 §3.1) le champ instance du document problem, sous forme d’URN urn:request:<uuid>. Il n’y a pas de propriété requestId de premier niveau : les clients doivent lire l’en-tête ou extraire l’URN de instance.
Masquage en production
DaloyJS retire le champ detail de toute réponse 5xx, sauf si l’environnement est positivement development ou test, afin que les messages d’erreur internes et les fragments SQL ne fuient pas vers les clients. L’erreur complète est toujours transmise à votre logger et au hook onError.
| Configuration | detail des 5xx |
|---|---|
env: "development" ou env: "test" | affiché |
pas de env, NODE_ENV=development ou test | affiché |
pas de env, NODE_ENV non défini, vide ou toute autre valeur | masqué |
env: "production", production: true ou NODE_ENV=production | masqué |
production: false avec NODE_ENV non défini | masqué |
Un environnement non défini échoue en mode fermé, volontairement. Les runtimes edge comme Cloudflare Workers et Deno Deploy n’ont pas de NODE_ENV, et le traiter comme development enverrait les messages d’exception aux clients. daloy dev définit NODE_ENV=development pour son processus enfant si vous ne l’avez pas défini : le développement local affiche donc toujours le détail. Les erreurs que vous sérialisez vous-même (par exemple un corps de réponse construit à partir de err.message dans un bloc catch) ne sont pas masquées. Levez-les plutôt, ou levez une HttpError avec un detail sans danger.
Classes d’erreur personnalisées
Les classes intégrées ci-dessus définissent toutes un type https://daloyjs.dev/errors/<slug>. Une HttpError simple levée sans type se rabat sur https://httpstatuses.io/<status>. Les middlewares officiels qui répondent 503 (loadShedding(), concurrencyLimit(), requestTimeoutStatus: 503) définissent leur propre type daloyjs.dev : le repli ne s’applique donc qu’aux erreurs que vous construisez vous-même. Définissez type lorsque les clients s’en servent comme clé, ou utilisez une classe intégrée :
Service indisponible
Pour un mode maintenance, une panne de dépendance ou une instance en cours de drainage, levez ServiceUnavailableError. Elle répond 503 avec un type stable https://daloyjs.dev/errors/service-unavailable, un Retry-After facultatif et cache-control: no-store, pour qu’un CDN ne continue jamais à servir la panne après votre rétablissement.
retryAfterSeconds doit être un entier non négatif. Toute autre valeur (NaN issu d’une variable d’environnement manquante, -1, 1.5) lève une RangeError au lieu d’envoyer un en-tête Retry-After malformé.
onError personnalisé
Dernière mise à jour :