NestJS : Du TypeScript côté serveur

Pierre Marais
05/09/2019

Préambule

JavaScript est le langage omniprésent, côté Front-End, de cette fin de décennie avec la popularité des frameworks JS Angular, React ou encore Vue. La question suivante se pose : Est-il envisageable d’utiliser du Javascript côté serveur ?

Sortie en 2009, Node.js est utilisé notamment par des grands noms du web comme Slack ou encore Discord. Pourtant de nombreuses entreprises et de nombreux développeurs semblent réfractaires à l’utilisation de Node.js. L’environnement souffre de certains aspects de JavaScript qui découragent le développeur à faire le grand saut :

  • La flexibilité du langage

  • son paradigme orienté prototype

  • sa capacité à interpréter n’importe quel code sans dire un mot font de lui un langage avec lequel on peut presque tout faire rapidement mais aussi créer du code indigeste et inutilisable.

  • le gestionnaire de paquets de Node.js NPM peut aussi faire peur à certains développeurs car il offre une très grande liberté d’importer du code.

La standardisation du langage avec ECMAScript 6 a permis de palier certains de ses “défauts” sans perdre pour autant ses avantages.

Pourtant les développeurs PHP continuent de développer en PHP et les développeurs Java continuent de développer en Java (voir en Kotlin). Le problème principal que pointe du doigt les développeurs frileux de passer au développement côté serveur en JavaScript est qu’il est difficile d’architecturer correctement son code. Il semble qu’avec Node.js seulement, il est compliqué de maintenir une application côté serveur avec une architecture simple et efficace.

Le framework

NestJS va peut-être pouvoir trouver une solution à ce problème. C’est un framework Node.js qui va offrir les avantages de JavaScript avec sa flexibilité et ses nombreuses librairies tout en incluant les concepts d’architectures modulaires et de nombreux design-patterns. Le framework peut donc permettre de créer des applications côté serveur mature.

Pour réussir à ajouter ce concept d’architecture mature et modulable à Node.js, NestJS va s’appuyer sur TypeScript.

TypeScript est un langage créé par Microsoft qui permet d’améliorer le développement JavaScript en ajoutant des fonctionnalités non présentes dans JavaScript et ECMAScript. La principale fonctionnalité reste le typage statique et générique optionnel mais de nombreuses fonctionnalités permettent un plus grand confort aux développeurs comme les énumérations, les alias, les unions, les paramètres optionnels ou encore les modules. TypeScript est ensuite transcompilé en JavaScript pour être supporté par tous les navigateurs.

NestJS applique les principes de la programmation orientée objet, de la programmation fonctionnelle et la programmation fonctionnelle asynchrone.

NestJS utilise par défaut le framework de serveur HTTP Express mais il est possible d’utiliser d’autre framework comme Fastify. Express met en place une infrastructure permettant de générer des serveurs web HTTP très facilement à l’aide de méthodes HTTP utilitaires. Utiliser Express permet donc de continuer à utiliser les fonctionnalités de Node.js.

Avec sa CLI, NestJS permet de créer rapidement des services, modules et contrôleurs pour son application. Cela devient donc plus facile de créer des micro-services. Ces composants facilitent la création de l’architecture d’une application.

Les controllers vont être le point d’entrée de l’application. C’est dans ces classes que seront définis les différentes routes de votre application, les requêtes acceptées en entrée, les réponses renvoyées au client. Les contrôleurs pourront faire appel à différents providers ou services.

Les providers sont appelés par les controllers ou par d’autres providers. C’est dans ces classes que le code le plus complexe d’une fonctionnalité va être développé. Le principe de l’injection de dépendances permet aux composants de communiquer entre eux (providers à controllers ou providers à providers).

Les modules permettent d’organiser la structure d’une application NestJS. En plus du module principale de l’application, NestJS permet de générer de multiples modules pour répartir le code. Chaque module inclut sa liste de providers, sa liste de controllers, les modules à importer pour son fonctionnement et les providers qu’il accepte d’exporter. En règle générale, un module va regrouper le controller et les providers spécifiques à une fonctionnalité, par exemple un module spécifique aux users.

@Controller(‘orders’)export class OrdersController {  constructor(private readonly ordersService: OrdersService) {}  @Post()  @UseGuards(AuthGuard())  async create(@Request() req, @Body() orderDto: OrderDto) {    if(req.user.role === ‘admin’) {      return await this.ordersService.create(orderDto);    }  throw new UnauthorizedException(); }}

NestJS va aussi utiliser le principe des decorators fournis par ECMAScript 6 pour mettre la définition de ses nombreux composants comme les controllers, providers ou modules. Cela permet de simplifier énormément la lisibilité du code mais aussi de rajouter des fonctionnalités en très peu de temps. Le decorator @UseGuards(AuthGuard()) permet par exemple de n’autoriser que les utilisateurs authentifiés à utiliser une route.

En plus de ces principes permettant de favoriser l’architecture d’une application, NestJS apporte de nombreuses autres fonctionnalités très utiles aux développeurs comme les Guards pour l’authentification, les ExceptionsFilters pour gérer les réponses en erreurs, une gestion des logs simplifiées ou encore une librairie de test pour tester son application.

Conclusion

Grâce à tous ces concepts, NestJS permet de favoriser le développement d’une application avec une architecture structurée palliant au passage le plus gros problème de Node.js, cela en gardant tous les avantages de JavaScript avec sa performance et sa flexibilité. Avec l’accès à NPM et sa communauté, NestJS garde donc l’accès à de nombreuses librairies JavaScript très utiles aux développeurs.

À l’heure actuelle, NestJS compte environ 13 900 stars sur GitHub. La version 6 vient de sortir (Mars 2019) et apporte de nouvelles fonctionnalités comme les Lifecycle Events ou les Platforms. NestJS qui offre une donc une surcouche TypeScript à Node.js devient donc une alternative solide à Java et PHP.

Slickteam