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

Une API from scratch avec NestJS

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 !

[email protected]

September 29, 2021
Tweet

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. #DevoxxFR 4
    Introduction à NestJS

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size 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 full-size slide

  10. #DevoxxFR 10
    Demo

    View full-size slide

  11. #DevoxxFR 11
    CQRS avec NestJS

    View full-size 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 full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size slide

  17. #DevoxxFR 17
    Demo

    View full-size slide

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

    View full-size 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 full-size slide

  20. #DevoxxFR 20
    Des questions ?

    View full-size slide

  21. #DevoxxFR 21
    Merci

    View full-size slide