$30 off During Our Annual Pro Sale. View Details »

Rethinking Enterprise Architectures with Node.js

Rethinking Enterprise Architectures with Node.js

A Node.js platform is built on top of a few principles. One of these is having a small set of functionalities, leaving the rest to the developers. This rule makes the learning curve as small as possible, and in combination with the same language reduces an amount of time spent on switching between front-end and back-end side. We glorify simplicity, we praise reusability, but the question is - how to really take advantage of them? In this talk, you'll learn why NestJS could increase your productivity and how to unlock your full potential as a JavaScript/TypeScript developer.

Kamil Mysliwiec

July 20, 2018
Tweet

More Decks by Kamil Mysliwiec

Other Decks in Programming

Transcript

  1. KAMMYSLIWIEC
    RETHINKING ENTERPRISE
    ARCHITECTURES WITH
    NODE.JS

    View Slide

  2. KAMMYSLIWIEC
    KAMIL MYŚLIWIEC
    SOFTWARE ENGINEER | NESTJS CREATOR

    @KAMMYSLIWIEC


    View Slide

  3. KAMIL MYŚLIWIEC
    SOFTWARE ENGINEER

    @KAMMYSLIWIEC


    View Slide

  4. KAMMYSLIWIEC
    NODE.JS

    View Slide

  5. KAMMYSLIWIEC
    NODE.JS IS A JAVASCRIPT
    RUNTIME BUILT ON TOP OF
    GOOGLE CHROME'S V8 ENGINE

    View Slide

  6. KAMMYSLIWIEC
    WHY NODE.JS?

    View Slide

  7. KAMMYSLIWIEC
    LANGUAGE

    View Slide

  8. KAMMYSLIWIEC
    PRODUCTIVITY

    View Slide

  9. KAMMYSLIWIEC
    REUSABILITY

    View Slide

  10. KAMMYSLIWIEC
    COMMUNITY

    View Slide

  11. KAMMYSLIWIEC
    JAVASCRIPT
    JAVA
    PYTHON
    C#
    PHP
    0% 17,5% 35% 52,5% 70%

    View Slide

  12. KAMMYSLIWIEC
    SIMPLICITY

    View Slide

  13. SIMPLICITY IS 

    PREREQUISITE
    FOR RELIABILITY

    View Slide

  14. KAMMYSLIWIEC
    NODE.JS IS SIMPLE

    View Slide

  15. KAMMYSLIWIEC
    NODE.JS IS SIMPLE?

    View Slide

  16. KAMMYSLIWIEC
    SETUP TIME
    1 MINUTE

    View Slide

  17. KAMMYSLIWIEC
    2 LINES 

    OF CODE

    View Slide

  18. KAMMYSLIWIEC
    const app = require('express')();
    app.listen(3000);

    View Slide

  19. KAMMYSLIWIEC
    const app = require('express')();
    app.listen(3000);

    View Slide

  20. KAMMYSLIWIEC
    const app = require(‘express')();
    app.get('/', (req, res) =>

    res.send('Hello world'));
    app.listen(3000);

    View Slide

  21. KAMMYSLIWIEC
    SIMPLICITY?

    View Slide

  22. KAMMYSLIWIEC
    COMPLEXITY
    LINES OF CODE
    y = x

    View Slide

  23. KAMMYSLIWIEC
    COMPLEXITY
    LINES OF CODE
    y = ex

    View Slide

  24. KAMMYSLIWIEC
    NODE.JS IS SIMPLE

    UP TO A CERTAIN POINT

    View Slide

  25. KAMMYSLIWIEC
    Simplicity
    Lines of code
    y = ex

    View Slide

  26. KAMMYSLIWIEC
    Simplicity
    Lines of code
    y = ex

    View Slide

  27. KAMMYSLIWIEC
    WHY?

    View Slide

  28. KAMMYSLIWIEC
    SIMPLICITY

    View Slide

  29. KAMMYSLIWIEC
    PROJECTS HEAVILY VARY
    BY PEOPLE’S DESIGN
    DECISIONS

    View Slide

  30. KAMMYSLIWIEC
    COMPLEXITY
    LINES OF CODE
    y = ex

    View Slide

  31. KAMMYSLIWIEC
    SIMPLICITY
    LINES OF CODE
    y = 1/ex

    View Slide

  32. KAMMYSLIWIEC
    SIMPLICITY
    LINES OF CODE
    y = 1/ex
    EXPECTED CURVE

    View Slide

  33. RETHINK

    View Slide

  34. KAMMYSLIWIEC
    SPLIT IT DOWN

    View Slide

  35. KAMMYSLIWIEC
    MIDDLEWARE

    View Slide

  36. KAMMYSLIWIEC
    MIDDLEWARE
    CLIENT
    REQUEST

    View Slide

  37. KAMMYSLIWIEC
    MIDDLEWARE
    CLIENT
    REQUEST
    MIDDLEWARE
    MIDDLEWARE

    View Slide

  38. KAMMYSLIWIEC
    TOO MANY
    RESPONSIBILITIES

    View Slide

  39. KAMMYSLIWIEC
    ERROR HANDLING
    ACCESS RESTRICTION
    VALIDATION
    SIDE-EFFECTS
    MUTATION

    View Slide

  40. KAMMYSLIWIEC
    SPLIT IT DOWN

    View Slide

  41. KAMMYSLIWIEC
    ERROR
    HANDLING
    VALIDATION
    ASYNC

    EFFECTS
    ACCESS

    RESTRICTION
    LOGGING
    MUTATION

    View Slide

  42. KAMMYSLIWIEC
    IT IS MISLEADING
    TO CALL THEM IN
    THE SAME WAY

    View Slide

  43. KAMMYSLIWIEC
    LOOSE COUPLING

    View Slide

  44. KAMMYSLIWIEC
    RELATIONS

    View Slide

  45. KAMMYSLIWIEC
    A B

    View Slide

  46. KAMMYSLIWIEC
    A B
    C

    View Slide

  47. KAMMYSLIWIEC
    DECOUPLE MODULES

    View Slide

  48. KAMMYSLIWIEC
    MODULE
    FACADE

    View Slide

  49. KAMMYSLIWIEC
    ORGANISE CODE 

    PER FEATURE

    View Slide

  50. KAMMYSLIWIEC
    DECOUPLE 

    TRANSFER LAYER

    View Slide

  51. KAMMYSLIWIEC
    TRANSFER

    LAYER
    DOMAIN 

    LAYER

    View Slide

  52. KAMMYSLIWIEC
    MULTILAYERED 

    ARCHITECTURE?

    View Slide

  53. KAMMYSLIWIEC
    CONTROLLER
    DATA

    ACCESS

    View Slide

  54. KAMMYSLIWIEC
    app.get(‘/organizations/:id’, (req, res) => {
    Organization.find({ name: 'JsCamp' },
    (err, value) => res.json(value));
    });

    View Slide

  55. KAMMYSLIWIEC
    app.get(‘/organizations/:id’, (req, res) => {
    Organization.find({ name: 'JsCamp' },
    (err, value) => res.json(value));
    });

    View Slide

  56. KAMMYSLIWIEC
    CONTROLLER
    DATA

    ACCESS
    SERVICE

    View Slide

  57. KAMMYSLIWIEC
    ENTITIES

    View Slide

  58. KAMMYSLIWIEC
    CONTROLLER
    DATA

    ACCESS
    SERVICE
    DOMAIN

    MODEL

    View Slide

  59. KAMMYSLIWIEC
    BE PROGRESSIVE

    View Slide

  60. KAMMYSLIWIEC
    app.get('/users', (req, res) => {
    usersService.findAll()
    .then((users) => {
    for (let user of users) {
    delete user.password;
    }
    return users;
    })
    .then((users) => res.json(users));
    });

    View Slide

  61. KAMMYSLIWIEC
    app.get('/users', (req, res) => {
    usersService.findAll()
    .then((users) => {
    for (let user of users) {
    delete user.password;
    }
    return users;
    })
    .then((users) => res.json(users));
    });

    View Slide

  62. KAMMYSLIWIEC
    app.get('/users', (req, res) => {
    usersService.findAll()
    .then((users) => {
    for (let user of users) {
    delete user.password;
    }
    return users;
    })
    .then((users) => res.json(users));
    });

    View Slide

  63. KAMMYSLIWIEC
    app.get('/users', (req, res) => {
    usersService.findAll()
    .then((users) => {
    for (let user of users) {
    delete user.password;
    }
    return users;
    })
    .then((users) => res.json(users));
    });

    View Slide

  64. KAMMYSLIWIEC
    @Get('users')
    async findAll() {
    return await this.usersService.findAll()
    .filter(user => !user.isDisabled)
    .map(user => omit(user, 'password'));
    }

    View Slide

  65. KAMMYSLIWIEC
    @Get('users')
    async findAll() {
    return await this.usersService.findAll()
    .filter(user => !user.isDisabled)
    .map(user => omit(user, 'password'));
    }

    View Slide

  66. KAMMYSLIWIEC
    @Get('users')
    async findAll() {
    return await this.usersService.findAll()
    .filter(user => !user.isDisabled)
    .map(user => omit(user, 'password'));
    }

    View Slide

  67. KAMMYSLIWIEC
    TYPES

    View Slide

  68. KAMMYSLIWIEC
    TYPES ARE 

    PRICELESS

    View Slide

  69. KAMMYSLIWIEC
    TRADE-OFF?

    View Slide

  70. KAMMYSLIWIEC
    TYPESCRIPT

    View Slide

  71. KAMMYSLIWIEC
    MODULE
    FACADE

    View Slide

  72. KAMMYSLIWIEC
    FACADE
    INPUT OUTPUT

    View Slide

  73. KAMMYSLIWIEC
    LET’S DRAW 

    CONCLUSIONS

    View Slide

  74. KAMMYSLIWIEC
    CLEAN ARCHITECTURE


    BOILERPLATE & DESIGN SPECIFICATION

    NOT DEVELOPER-FRIENDLY

    View Slide

  75. KAMMYSLIWIEC
    NESTJS
    WWW.NESTJS.COM

    @NESTFRAMEWORK


    View Slide

  76. KAMMYSLIWIEC
    WHY?

    View Slide

  77. KAMMYSLIWIEC
    WE ARE NOT ANOTHER
    FRAMEWORK

    View Slide

  78. KAMMYSLIWIEC
    WE ARE THE OPPOSITE

    View Slide

  79. KAMMYSLIWIEC
    LOW ENTRY

    THRESHOLD

    View Slide

  80. KAMMYSLIWIEC
    FULLY-FEATURED

    View Slide

  81. KAMMYSLIWIEC
    REACTIVE

    View Slide

  82. KAMMYSLIWIEC
    COMPATIBILITY

    View Slide

  83. KAMMYSLIWIEC

    View Slide

  84. KAMMYSLIWIEC

    View Slide

  85. KAMMYSLIWIEC
    OPEN SOURCE

    View Slide

  86. KAMMYSLIWIEC

    View Slide

  87. KAMMYSLIWIEC
    THANK

    YOU
    @KAMMYSLIWIEC

    View Slide