4
votes

Quelle est la meilleure façon de gérer une réponse 204 No Content dans NestJS?

J'écris une API RESTful dans Nest, que j'ai récemment commencé à utiliser et que j'aime jusqu'à présent. Cependant, j'ai du mal à trouver un modèle propre pour gérer 204 réponses sans contenu pour mes routes GET. Des recommandations?

Je suis un peu surpris qu'il n'y ait pas quelque chose de intégré dans le framework pour renvoyer 204 si l'objet retourné par une méthode de contrôleur GET est vide - s'il y en a, je ne l'ai pas encore trouvé. S'il n'y en a vraiment pas, je me demande également si cela vaut une demande de fonctionnalité sur GitHub.

J'ai essayé ce qui suit:

  • Exposer la propriété Express res en utilisant @Response() comme paramètre de méthode Controller, puis en utilisant res.sendStatus(204) si la réponse est vide. Cependant, cela m'oblige également à envoyer manuellement 200 réponses, alors que je voudrais toujours me fier au framework pour gérer le cycle demande-réponse et garder mes méthodes de contrôleur aussi propres que possible.
  • On a cherché à utiliser un intercepteur pour vérifier si l'objet de réponse est vide, puis à écrire le code d'état 204 dans la réponse. Je ne veux pas vraiment faire cela car le code d'état pourrait changer plus tard en raison d'un filtre d'exception.
  • Utilisation du middleware pour écrire le code de réponse, mais mon middleware s'exécute avant d'être acheminé vers le contrôleur et je dois vérifier si la réponse est vide après cela. res.on ('send') ne semble pas non plus intercepter la réponse à sa sortie.
  • Lancer une NoContentException personnalisée pour mon filtre d'exception à gérer. Bien qu'il soit étrange de lancer une exception pour un code de réponse réussi, je pense que c'est ainsi que je procéderai entre-temps, car mon filtre d'exception est la dernière chose qui s'exécutera dans le code que j'ai écrit.

1 commentaires

voir la mise à jour dans ma réponse, c'est désormais possible avec les intercepteurs. :-)


3 Réponses :


4
votes

Mise à jour v6.1.0

Depuis la v6.1.0, il est possible de définir le code de réponse dans un intercepteur, voir ce PR .


Réponse obsolète

Malheureusement, cela ne semble pas encore possible. Dans les documents, il est dit:

Souvent, votre code d'état n'est pas statique mais dépend de divers facteurs. Dans ce cas, vous pouvez utiliser un objet de réponse spécifique à la bibliothèque (injecter à l'aide de @Res() ) (ou, en cas d'erreur, lever une exception).

Vous ne pouvez pas non plus simplement définir le code de réponse dans un Interceptor sans l'envoyer (au lieu de sendStatus ) car, comme Kamil l'a dit dans ce fil :

La logique du contrôleur de réponse globale est la dernière étape effectuée juste avant l'envoi d'un résultat final via le réseau (c'est là que les codes d'état par défaut entrent en jeu).

Donc, si vous ne voulez (naturellement) pas utiliser @Res dans chaque contrôleur, un ExceptionFilter semble être la meilleure option, même si cela ne semble pas tout à fait correct.

Étant donné que d'autres personnes semblent avoir exactement le même problème , une demande de fonctionnalité peut être une bonne idée. :-)


1 commentaires

J'ai trouvé ces réponses (également de @ kim-kern) utiles également lorsque j'ai rencontré cette situation: stackoverflow.com/questions/55406194/... stackoverflow.com/questions/51695868/...



0
votes
  • Initialement pour la pratique de la production de réponses 204 No Content, il a été mentionné dans le document officiel à la position de l'introduction de la fonction d'annotation de code d'état de nestjs .
  • À propos de l'idée de générer une réponse 204 en vérifiant si le contenu de la réponse est vide

    cela pourrait être possible et réalisable dans la programmation Express.js directement ou dans la construction d'un intercepteur en tant que plugin middleware dans l'utilisation du framework nestjs, comme mentionné dans la réponse @ kim-kern .

    Cependant, au niveau de la conception de l'API, ce n'est pas une fonctionnalité requise car une API doit idéalement être conçue comme une réponse de réussite, ce qui signifie qu'un seul code de réussite serait disponible pour un point de terminaison. De ce point de vue, l'annotation du code d'état pourrait être acceptable.


0 commentaires

0
votes

En regardant cet exemple :

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

C'est tout ce que vous devez faire. Il revient à 204 pour vous.


2 commentaires

Il existe une énumération pour les codes d'état HTTP: HttpStatus. Vous pouvez donc faire: @HttpCode (HttpStatus.NO_CONTENT)


Nice, je ne savais pas à ce sujet.