Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Une API from scratch avec NestJS

paul souche
September 29, 2021

Une API from scratch avec NestJS

NestJS est un framework Node.js progressif permettant de développer des applications côté serveur. Il est écrit en TypeScript, s'inspire de l'architecture d'Angular et permet de construire des APIs Rest, GraphQL ou WebSocket. NestJS offre aussi de nombreux modules utiles pour développer vos application (OpenAPI, TypeORM, CQRS, ...) dont un permettant la mise en oeuvre des microservices.

Depuis quelques mois le framework est devenu très populaire dans la communauté Node.js, notamment grâce à la productivité qu'il procure. C'est pourquoi dans cette session, nous vous proposons de découvrir son éfficacité en développant une API "production ready" en partant de zéro !

paul souche

September 29, 2021
Tweet

More Decks by paul souche

Other Decks in Programming

Transcript

  1. #DevoxxFR
    Devoxx France 2021
    Une API from scratch avec NestJS
    Sylvain Pontoreau @spontoreau
    Paul Souche @paulsouche
    1

    View Slide

  2. Présentation
    2
    Paul Souche
    @paulsouche
    Développeur @aircall
    Sylvain Pontoreau
    @spontoreau
    Chômeur @pole_emploi

    View Slide

  3. #DevoxxFR
    Au programme
    3
    Introduction
    Auth
    CQRS TypeORM
    Swagger

    View Slide

  4. #DevoxxFR 4
    Introduction à NestJS

    View Slide

  5. Main file
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    async function bootstrap() {
    const app = await NestFactory
    .create(AppModule);
    await app.listen(3000);
    }
    bootstrap();
    5

    View Slide

  6. Premier module
    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    @Module({
    controllers: [AppController],
    providers: [AppService],
    })
    export class AppModule {}
    6

    View Slide

  7. Un exemple de controller
    import { Controller, Get } from '@nestjs/common';
    @Controller('/')
    export class AppController {
    @Get()
    hello(): string {
    return 'Hello Devoxx 2021';
    }
    }
    7

    View Slide

  8. L'injection
    import { Controller, Get } from '@nestjs/common';
    import { AppService } from './app.service';
    @Controller('/')
    export class AppController {
    constructor(
    private readonly service: AppService
    ) {}
    @Get()
    findAll(): string {
    return this.service.sayHello();
    }
    }
    8

    View Slide

  9. Un framework opiniated
    import { Module } from '@nestjs/common';
    import { JwtModule } from '@nestjs/jwt';
    import { PassportModule } from '@nestjs/passport';
    @Module({
    imports: [
    JwtModule.register({
    secretOrPrivateKey: process.ENV.JWT_SECRET,
    signOptions: {
    expiresIn: 3600,
    },
    }),
    PassportModule.register({
    defaultStrategy: 'jwt'
    }),
    ],
    })
    export class AppModule {}
    9

    View Slide

  10. #DevoxxFR 10
    Demo

    View Slide

  11. #DevoxxFR 11
    CQRS avec NestJS

    View Slide

  12. #DevoxxFR
    Le pattern CQRS
    • CQS
    • Command : exécuter une tâche
    • Query : retourner une information
    • CQRS
    • Responsabilités ségrégées
    • Lecture != Écriture
    • Pure
    • https://www.eventstore.com/a-beginners-guide-to-cqrs
    12

    View Slide

  13. Première Query
    import { IQuery } from '@nestjs/cqrs';
    export class SayHelloQuery implements IQuery {
    constructor(
    readonly name: string
    ) { }
    }
    13

    View Slide

  14. Handler
    import {
    QueryHandler, IQueryHandler
    } from '@nestjs/cqrs';
    import {
    SayHelloQuery
    } from './sayHelloQuery';
    @QueryHandler(SayHelloQuery)
    export class SayHelloQueryHandler
    implements IQueryHandler {
    execute({ name }: SayHelloQuery) {
    return `Hello ${ name }`;
    }
    }
    14

    View Slide

  15. Utilisation dans un contrôleur
    import {
    Controller, Get, Param
    } from '@nestjs/common';
    import { QueryBus } from '@nestjs/cqrs';
    import { SayHelloQuery } from './sayHello.query';
    @Controller('/')
    export class AppController {
    constructor(
    private readonly queryBus: QueryBus
    ) { }
    @Get(':name')
    async sayHello(@Param() name: string) {
    return this.queryBus.execute(
    new SayHelloQuery(name)
    );
    }
    }
    15

    View Slide

  16. Déclaration dans un module
    import { Module } from '@nestjs/common';
    import { CqrsModule } from '@nestjs/cqrs';
    import {
    SayHelloQueryHandler
    } from './sayHello.handler';
    @Module({
    imports: [CqrsModule],
    controllers: [AppController],
    providers: [SayHelloQueryHandler],
    })
    export class AppModule {}
    16

    View Slide

  17. #DevoxxFR 17
    Demo

    View Slide

  18. #DevoxxFR
    Conclusion
    18
    https://github.com/paulsouche/devoxx-cfp-api

    View Slide

  19. Ressources
    1
    9
    NestJS

    Website : https://nestjs.com/

    Doc: https://docs.nestjs.com/

    TypeORM : https://docs.nestjs.com/recipes/sql-typeorm

    CQRS: https://docs.nestjs.com/recipes/cqrs

    Swagger: https://docs.nestjs.com/openapi/introduction
    Sample https://github.com/paulsouche/devoxx-cfp-api
    CQRS (guide) https://www.eventstore.com/a-beginners-guide-to-cqrs

    View Slide

  20. #DevoxxFR 20
    Des questions ?

    View Slide

  21. #DevoxxFR 21
    Merci

    View Slide