рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рд╕рдзреНрдпрд╛, REST API рд╣реЗ рд╡реЗрдм рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯрд╕рд╛рдареА рдПрдХ рдорд╛рдирдХ рдмрдирд▓реЗ рдЖрд╣реЗ, рдЬреНрдпрд╛рдореБрд│реЗ рд╡рд┐рдХрд╛рд╕ рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЕрдБрдЧреБрд▓рд░, рд░рд┐рдЕреЕрдХреНрдЯ, рд╡реНрд╣реНрдпреВ рдЖрдгрд┐ рдЗрддрд░ рд╕рд╛рд░рдЦреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдзреНрдпрд╛ UI рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. рдмреЕрдХрдПрдВрдб рдбреЗрд╡реНрд╣рд▓рдкрд░ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рднрд╛рд╖рд╛ рдЖрдгрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХрдордзреВрди рдирд┐рд╡рдбреВ рд╢рдХрддрд╛рдд. рдЖрдЬ рдореА рдЕрд╢рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХрдмрджреНрджрд▓ рдмреЛрд▓реВ рдЗрдЪреНрдЫрд┐рддреЛ рдиреЗрд╕реНрдЯрдЬреЗрдПрд╕. рдЖрдореНрд╣реА рдордзреНрдпреЗ рдЖрд╣реЛрдд рдЯреЗрд╕реНрдЯрдореЗрд╕ рдЖрдореНрд╣реА рддреЗ рдЕрдВрддрд░реНрдЧрдд рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рд╕рдХреНрд░рд┐рдпрдкрдгреЗ рд╡рд╛рдкрд░рддреЛ. рдШрд░рдЯреЗ рдЖрдгрд┐ рдкреЕрдХреЗрдЬ рд╡рд╛рдкрд░рдгреЗ @nestjsx/crud, рдЖрдореНрд╣реА рдПрдХ рд╕рд╛рдзрд╛ CRUD рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░реВ.

NestJS рдХрд╛

рдЕрд▓реАрдХрдбреЗ, JavaScript рд╕рдореБрджрд╛рдпрд╛рдордзреНрдпреЗ рдмрд░реЗрдЪ рдмреЕрдХрдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реЗ рдЖрд╣реЗрдд. рдЖрдгрд┐ рдЬрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рддреЗ рдиреЗрд╕реНрдЯрд▓рд╛ рд╕рдорд╛рди рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛рдд, рддрд░ рдПрдХрд╛ рдЧреЛрд╖реНрдЯреАрдд рддреЗ рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рдЬрд┐рдВрдХрддреЗ - рд╣реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрд╣реЗ. рдЦрд╛рд▓реАрд▓ NestJS рд╡реИрд╢рд┐рд╖реНтАНрдЯреНрдпреЗ рддреБрдореНтАНрд╣рд╛рд▓рд╛ рдЗрдВрдбрд╕реНтАНрдЯреНрд░реАрдЕрд▓ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНтАНрдпрд╛рдЪреА рдЖрдгрд┐ рдореЛрдареНрдпрд╛ рдЯреАрдорд╕рд╛рдареА рд╕реНрдХреЗрд▓ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдХрд░рдгреНтАНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рджреЗрддрд╛рдд:

  • рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕ рднрд╛рд╖рд╛ рдореНрд╣рдгреВрди TypeScript рд╡рд╛рдкрд░рдгреЗ. NestJS JavaScript рдЪреЗ рд╕рдорд░реНрдерди рдХрд░рдд рдЕрд╕рд▓реЗ рддрд░реА, рдХрд╛рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рд░реНрдп рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рд╡рд┐рд╢реЗрд╖рдд: рдЬрд░ рдЖрдкрдг рддреГрддреАрдп-рдкрдХреНрд╖рд╛рдЪреНрдпрд╛ рдкреЕрдХреЗрдЬрдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд;
  • рдбреАрдЖрдп рдХрдВрдЯреЗрдирд░рдЪреА рдЙрдкрд╕реНрдерд┐рддреА, рдЬреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕реИрд▓рдкрдгреЗ рдЬреЛрдбрд▓реЗрд▓реЗ рдШрдЯрдХ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ;
  • рдлреНрд░реЗрдорд╡рд░реНрдХрдЪреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡рддрдВрддреНрд░ рдЕрджрд▓рд╛рдмрджрд▓ рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдШрдЯрдХрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореНрд╣рдгреВрди рд╣реБрдб рдЕрдВрддрд░реНрдЧрдд рддреЗ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рд╡реНрдпрдХреНрдд рдХрд░рд╛, рдЖрдгрд┐ рдЬрд▓рдж рдХрд░рдгреЗ, рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдиреЗрд╕реНрдЯ рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕ рд▓рд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рдЯрд╛рдпрдкреЙрд░реНрдо, рдореБрдВрдЧреВрд╕, рд╕рд┐рдХреНрд╡реЗрд▓ рдХрд░рдгреЗ;
  • NestJS рд╣реЗ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рдЖрд╣реЗ рдЖрдгрд┐ REST, GraphQL, Websockets, gRPC рдЗрддреНрдпрд╛рджреАрдВрдирд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ.

рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реНрд╡рддрдГрдЪ рдЕрдБрдЧреБрд▓рд░ рдлреНрд░рдВрдЯрдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХрдкрд╛рд╕реВрди рдкреНрд░реЗрд░рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рд╡реИрдЪрд╛рд░рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рдмрд░реЗрдЪ рд╕рд╛рдореНрдп рдЖрд╣реЗ.

NestJS рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдк рддреИрдирд╛рдд рдХрд░рдгреЗ

Nest рдордзреНрдпреЗ рдПрдХ рдкреЕрдХреЗрдЬ рдЖрд╣реЗ рдШрд░рдЯреЗ/cli, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрд╡рд░реАрдд рдореВрд▓рднреВрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЪрд▓рд╛ рд╣реЗ рдкреЕрдХреЗрдЬ рдЬрд╛рдЧрддрд┐рдХ рд╕реНрддрд░рд╛рд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛:

npm install --global @nest/cli

рдЗрдиреНрд╕реНрдЯреЙрд▓реЗрд╢рдирдирдВрддрд░, рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреЗ рдореВрд│ рдлреНрд░реЗрдорд╡рд░реНрдХ рдирд╛рд╡рд╛рд╕рд╣ рддрдпрд╛рд░ рдХрд░реВ nest-resрдЯ. рд╣реЗ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ nest new nest-rest.

nest new nest-rest

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects $ nest new nest-rest
  We will scaffold your app in a few seconds..

CREATE /nest-rest/.prettierrc (51 bytes)
CREATE /nest-rest/README.md (3370 bytes)
CREATE /nest-rest/nest-cli.json (84 bytes)
CREATE /nest-rest/nodemon-debug.json (163 bytes)
CREATE /nest-rest/nodemon.json (67 bytes)
CREATE /nest-rest/package.json (1805 bytes)
CREATE /nest-rest/tsconfig.build.json (97 bytes)
CREATE /nest-rest/tsconfig.json (325 bytes)
CREATE /nest-rest/tslint.json (426 bytes)
CREATE /nest-rest/src/app.controller.spec.ts (617 bytes)
CREATE /nest-rest/src/app.controller.ts (274 bytes)
CREATE /nest-rest/src/app.module.ts (249 bytes)
CREATE /nest-rest/src/app.service.ts (142 bytes)
CREATE /nest-rest/src/main.ts (208 bytes)
CREATE /nest-rest/test/app.e2e-spec.ts (561 bytes)
CREATE /nest-rest/test/jest-e2e.json (183 bytes)

? Which package manager would you я╕П to use? yarn
 Installation in progress... 

  Successfully created project nest-rest
  Get started with the following commands:

$ cd nest-rest
$ yarn run start

                          Thanks for installing Nest 
                 Please consider donating to our open collective
                        to help us maintain this package.

                 Donate: https://opencollective.com/nest

рдЖрдореНрд╣реА рдЖрдордЪреЗ рдкреЕрдХреЗрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореНрд╣рдгреВрди рд╕реВрдд рдирд┐рд╡рдбреВ.
рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рддреБрдореНрд╣реА рдХрдорд╛рдВрдбрд╕рд╣ рд╕рд░реНрд╡реНрд╣рд░ рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛ npm start рдЖрдгрд┐ рдкрддреНрддреНрдпрд╛рд╡рд░ рдЬрд╛рдд рдЖрд╣реЗ http://localhost:3000 рдЖрдкрдг рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд╛рд╣реВ рд╢рдХрддрд╛. рддрдерд╛рдкрд┐, рдЖрдореНрд╣реА рдпреЗрдереЗ рдЬрдорд▓реЛ рдирд╛рд╣реА рдЖрдгрд┐ рдЖрдореНрд╣реА рдкреБрдвреЗ рдЬрд╛рдд рдЖрд╣реЛрдд.

рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рд╕реЗрдЯ рдХрд░рдгреЗ

рдореА рдпрд╛ рд▓реЗрдЦрд╛рд╕рд╛рдареА DBMS рдореНрд╣рдгреВрди PostrgreSQL рдирд┐рд╡рдбрд▓реЗ. рдЕрднрд┐рд░реБрдЪреАрдмрджреНрджрд▓ рдХреЛрдгрддрд╛рд╣реА рд╡рд╛рдж рдирд╛рд╣реА; рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рд╣реЗ рд╕рд░реНрд╡ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛ рдЕрд╕рд▓реЗрд▓реЗ рд╕рд░реНрд╡рд╛рдд рдкрд░рд┐рдкрдХреНрд╡ DBMS рдЖрд╣реЗ. рдЖрдзреАрдЪ рдирдореВрдж рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдиреЗрд╕реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╡рд┐рдз рдкреЕрдХреЗрдЬреЗрд╕рд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдХрд╛рд░рдг рдорд╛рдЭреА рдирд┐рд╡рдб PostgreSQL рд╡рд░ рдкрдбрд▓реНрдпрд╛рдореБрд│реЗ, TypeORM рд▓рд╛ ORM рдореНрд╣рдгреВрди рдирд┐рд╡рдбрдгреЗ рддрд░реНрдХрд╕рдВрдЧрдд рдЕрд╕реЗрд▓. рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдгрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛:

yarn add typeorm @nestjs/typeorm pg

рдХреНрд░рдорд╛рдиреЗ, рдкреНрд░рддреНрдпреЗрдХ рдкреЕрдХреЗрдЬ рдХрд╢рд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

  1. typeorm - рдереЗрдЯ ORM рд╡рд░реВрдирдЪ рдкреЕрдХреЗрдЬ;
  2. @nestjs/typeorm - NestJS рд╕рд╛рдареА TypeORM рдкреЕрдХреЗрдЬ. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЙрдбреНрдпреВрд▓реНрд╕рдордзреНрдпреЗ рдЖрдпрд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореЙрдбреНрдпреВрд▓реНрд╕, рддрд╕реЗрдЪ рд╣реЗрд▓реНрдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕рдЪрд╛ рд╕рдВрдЪ рдЬреЛрдбрддреЗ;
  3. pg - PostgreSQL рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбреНрд░рд╛рдЗрд╡реНрд╣рд░.

рдареАрдХ рдЖрд╣реЗ, рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдЖрд╣реЗрдд, рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрд╡рддрдГ рд▓рд╛рдБрдЪ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдЦрд╛рд▓реАрд▓ рд╕рд╛рдордЧреНрд░реАрд╕рд╣ docker-compose.yml рд╡рд╛рдкрд░реЗрди:

docker-compose.yml

version: '3.1'

services:
  db:
    image: postgres:11.2
    restart: always
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - ../db:/var/lib/postgresql/data
      - ./postgresql.conf:/etc/postgresql/postgresql.conf
    ports:
      - 5432:5432
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рд╣реА рдлрд╛рдЗрд▓ 2 рдХрдВрдЯреЗрдирд░ рд▓рд╛рдБрдЪ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рддреЗ:

  1. db рдереЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрд╕рд▓реЗрд▓рд╛ рдХрдВрдЯреЗрдирд░ рдЖрд╣реЗ. рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, postgresql рдЖрд╡реГрддреНрддреА 11.2 рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ;
  2. рдкреНрд░рд╢рд╛рд╕рдХ - рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ. рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

tcp рдХрдиреЗрдХреНрд╢рдирд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдЦрд╛рд▓реАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд▓реЗ рдЖрд╣реЗ.

postgresql.conf

# -----------------------------
# PostgreSQL configuration file
# -----------------------------
#
# This file consists of lines of the form:
#
#   name = value
#
# (The "=" is optional.)  Whitespace may be used.  Comments are introduced with
# "#" anywhere on a line.  The complete list of parameter names and allowed
# values can be found in the PostgreSQL documentation.
#
# The commented-out settings shown in this file represent the default values.
# Re-commenting a setting is NOT sufficient to revert it to the default value;
# you need to reload the server.
#
# This file is read on server startup and when the server receives a SIGHUP
# signal.  If you edit the file on a running system, you have to SIGHUP the
# server for the changes to take effect, run "pg_ctl reload", or execute
# "SELECT pg_reload_conf()".  Some parameters, which are marked below,
# require a server shutdown and restart to take effect.
#
# Any parameter can also be given as a command-line option to the server, e.g.,
# "postgres -c log_connections=on".  Some parameters can be changed at run time
# with the "SET" SQL command.
#
# Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
#                MB = megabytes                     s   = seconds
#                GB = gigabytes                     min = minutes
#                TB = terabytes                     h   = hours
#                                                   d   = days
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.
#data_directory = 'ConfigDir'       # use data in another directory
# (change requires restart)
#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
# (change requires restart)
#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
# (change requires restart)
# If external_pid_file is not explicitly set, no extra PID file is written.
#external_pid_file = ''         # write an extra PID file
# (change requires restart)
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*'
#listen_addresses = 'localhost'     # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
#port = 5432                # (change requires restart)
#max_connections = 100          # (change requires restart)
#superuser_reserved_connections = 3 # (change requires restart)
#unix_socket_directories = '/tmp'   # comma-separated list of directories
# (change requires restart)
#unix_socket_group = ''         # (change requires restart)
#unix_socket_permissions = 0777     # begin with 0 to use octal notation
# (change requires restart)
#bonjour = off              # advertise server via Bonjour
# (change requires restart)
#bonjour_name = ''          # defaults to the computer name
# (change requires restart)
# - TCP Keepalives -
# see "man 7 tcp" for details
#tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
# 0 selects the system default
#tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
# 0 selects the system default
#tcp_keepalives_count = 0       # TCP_KEEPCNT;
# 0 selects the system default
# - Authentication -
#authentication_timeout = 1min      # 1s-600s
#password_encryption = md5      # md5 or scram-sha-256
#db_user_namespace = off
# GSSAPI using Kerberos
#krb_server_keyfile = ''
#krb_caseins_users = off
# - SSL -
#ssl = off
#ssl_ca_file = ''
#ssl_cert_file = 'server.crt'
#ssl_crl_file = ''
#ssl_key_file = 'server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_min_protocol_version = 'TLSv1'
#ssl_max_protocol_version = ''
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
# - Memory -
#shared_buffers = 32MB          # min 128kB
# (change requires restart)
#huge_pages = try           # on, off, or try
# (change requires restart)
#temp_buffers = 8MB         # min 800kB
#max_prepared_transactions = 0      # zero disables the feature
# (change requires restart)
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
#work_mem = 4MB             # min 64kB
#maintenance_work_mem = 64MB        # min 1MB
#autovacuum_work_mem = -1       # min 1MB, or -1 to use maintenance_work_mem
#max_stack_depth = 2MB          # min 100kB
#shared_memory_type = mmap      # the default is the first option
# supported by the operating system:
#   mmap
#   sysv
#   windows
# (change requires restart)
#dynamic_shared_memory_type = posix # the default is the first option
# supported by the operating system:
#   posix
#   sysv
#   windows
#   mmap
# (change requires restart)
# - Disk -
#temp_file_limit = -1           # limits per-process temp file space
# in kB, or -1 for no limit
# - Kernel Resources -
#max_files_per_process = 1000       # min 25
# (change requires restart)
# - Cost-Based Vacuum Delay -
#vacuum_cost_delay = 0          # 0-100 milliseconds (0 disables)
#vacuum_cost_page_hit = 1       # 0-10000 credits
#vacuum_cost_page_miss = 10     # 0-10000 credits
#vacuum_cost_page_dirty = 20        # 0-10000 credits
#vacuum_cost_limit = 200        # 1-10000 credits
# - Background Writer -
#bgwriter_delay = 200ms         # 10-10000ms between rounds
#bgwriter_lru_maxpages = 100        # max buffers written/round, 0 disables
#bgwriter_lru_multiplier = 2.0      # 0-10.0 multiplier on buffers scanned/round
#bgwriter_flush_after = 0       # measured in pages, 0 disables
# - Asynchronous Behavior -
#effective_io_concurrency = 1       # 1-1000; 0 disables prefetching
#max_worker_processes = 8       # (change requires restart)
#max_parallel_maintenance_workers = 2   # taken from max_parallel_workers
#max_parallel_workers_per_gather = 2    # taken from max_parallel_workers
#parallel_leader_participation = on
#max_parallel_workers = 8       # maximum number of max_worker_processes that
# can be used in parallel operations
#old_snapshot_threshold = -1        # 1min-60d; -1 disables; 0 is immediate
# (change requires restart)
#backend_flush_after = 0        # measured in pages, 0 disables
#------------------------------------------------------------------------------
# WRITE-AHEAD LOG
#------------------------------------------------------------------------------
# - Settings -
#wal_level = replica            # minimal, replica, or logical
# (change requires restart)
#fsync = on             # flush data to disk for crash safety
# (turning this off can cause
# unrecoverable data corruption)
#synchronous_commit = on        # synchronization level;
# off, local, remote_write, remote_apply, or on
#wal_sync_method = fsync        # the default is the first option
# supported by the operating system:
#   open_datasync
#   fdatasync (default on Linux)
#   fsync
#   fsync_writethrough
#   open_sync
#full_page_writes = on          # recover from partial page writes
#wal_compression = off          # enable compression of full-page writes
#wal_log_hints = off            # also do full page writes of non-critical updates
# (change requires restart)
#wal_buffers = -1           # min 32kB, -1 sets based on shared_buffers
# (change requires restart)
#wal_writer_delay = 200ms       # 1-10000 milliseconds
#wal_writer_flush_after = 1MB       # measured in pages, 0 disables
#commit_delay = 0           # range 0-100000, in microseconds
#commit_siblings = 5            # range 1-1000
# - Checkpoints -
#checkpoint_timeout = 5min      # range 30s-1d
#max_wal_size = 1GB
#min_wal_size = 80MB
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_flush_after = 0     # measured in pages, 0 disables
#checkpoint_warning = 30s       # 0 disables
# - Archiving -
#archive_mode = off     # enables archiving; off, on, or always
# (change requires restart)
#archive_command = ''       # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
#               %f = file name only
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0        # force a logfile segment switch after this
# number of seconds; 0 disables
# - Archive Recovery -
# These are only used in recovery mode.
#restore_command = ''       # command to use to restore an archived logfile segment
# placeholders: %p = path of file to restore
#               %f = file name only
# e.g. 'cp /mnt/server/archivedir/%f %p'
# (change requires restart)
#archive_cleanup_command = ''   # command to execute at every restartpoint
#recovery_end_command = ''  # command to execute at completion of recovery
# - Recovery Target -
# Set these only when performing a targeted recovery.
#recovery_target = ''       # 'immediate' to end recovery as soon as a
# consistent state is reached
# (change requires restart)
#recovery_target_name = ''  # the named restore point to which recovery will proceed
# (change requires restart)
#recovery_target_time = ''  # the time stamp up to which recovery will proceed
# (change requires restart)
#recovery_target_xid = ''   # the transaction ID up to which recovery will proceed
# (change requires restart)
#recovery_target_lsn = ''   # the WAL LSN up to which recovery will proceed
# (change requires restart)
#recovery_target_inclusive = on # Specifies whether to stop:
# just after the specified recovery target (on)
# just before the recovery target (off)
# (change requires restart)
#recovery_target_timeline = 'latest'    # 'current', 'latest', or timeline ID
# (change requires restart)
#recovery_target_action = 'pause'   # 'pause', 'promote', 'shutdown'
# (change requires restart)
#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
# - Sending Servers -
# Set these on the master and on any standby that will send replication data.
#max_wal_senders = 10       # max number of walsender processes
# (change requires restart)
#wal_keep_segments = 0      # in logfile segments; 0 disables
#wal_sender_timeout = 60s   # in milliseconds; 0 disables
#max_replication_slots = 10 # max number of replication slots
# (change requires restart)
#track_commit_timestamp = off   # collect timestamp of transaction commit
# (change requires restart)
# - Master Server -
# These settings are ignored on a standby server.
#synchronous_standby_names = '' # standby servers that provide sync rep
# method to choose sync standbys, number of sync standbys,
# and comma-separated list of application_name
# from standby(s); '*' = all
#vacuum_defer_cleanup_age = 0   # number of xacts by which cleanup is delayed
# - Standby Servers -
# These settings are ignored on a master server.
#primary_conninfo = ''          # connection string to sending server
# (change requires restart)
#primary_slot_name = ''         # replication slot on sending server
# (change requires restart)
#promote_trigger_file = ''      # file name whose presence ends recovery
#hot_standby = on           # "off" disallows queries during recovery
# (change requires restart)
#max_standby_archive_delay = 30s    # max delay before canceling queries
# when reading WAL from archive;
# -1 allows indefinite delay
#max_standby_streaming_delay = 30s  # max delay before canceling queries
# when reading streaming WAL;
# -1 allows indefinite delay
#wal_receiver_status_interval = 10s # send replies at least this often
# 0 disables
#hot_standby_feedback = off     # send info from standby to prevent
# query conflicts
#wal_receiver_timeout = 60s     # time that receiver waits for
# communication from master
# in milliseconds; 0 disables
#wal_retrieve_retry_interval = 5s   # time to wait before retrying to
# retrieve WAL after a failed attempt
#recovery_min_apply_delay = 0       # minimum delay for applying changes during recovery
# - Subscribers -
# These settings are ignored on a publisher.
#max_logical_replication_workers = 4    # taken from max_worker_processes
# (change requires restart)
#max_sync_workers_per_subscription = 2  # taken from max_logical_replication_workers
#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------
# - Planner Method Configuration -
#enable_bitmapscan = on
#enable_hashagg = on
#enable_hashjoin = on
#enable_indexscan = on
#enable_indexonlyscan = on
#enable_material = on
#enable_mergejoin = on
#enable_nestloop = on
#enable_parallel_append = on
#enable_seqscan = on
#enable_sort = on
#enable_tidscan = on
#enable_partitionwise_join = off
#enable_partitionwise_aggregate = off
#enable_parallel_hash = on
#enable_partition_pruning = on
# - Planner Cost Constants -
#seq_page_cost = 1.0            # measured on an arbitrary scale
#random_page_cost = 4.0         # same scale as above
#cpu_tuple_cost = 0.01          # same scale as above
#cpu_index_tuple_cost = 0.005       # same scale as above
#cpu_operator_cost = 0.0025     # same scale as above
#parallel_tuple_cost = 0.1      # same scale as above
#parallel_setup_cost = 1000.0   # same scale as above
#jit_above_cost = 100000        # perform JIT compilation if available
# and query more expensive than this;
# -1 disables
#jit_inline_above_cost = 500000     # inline small functions if query is
# more expensive than this; -1 disables
#jit_optimize_above_cost = 500000   # use expensive JIT optimizations if
# query is more expensive than this;
# -1 disables
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
#effective_cache_size = 4GB
# - Genetic Query Optimizer -
#geqo = on
#geqo_threshold = 12
#geqo_effort = 5            # range 1-10
#geqo_pool_size = 0         # selects default based on effort
#geqo_generations = 0           # selects default based on effort
#geqo_selection_bias = 2.0      # range 1.5-2.0
#geqo_seed = 0.0            # range 0.0-1.0
# - Other Planner Options -
#default_statistics_target = 100    # range 1-10000
#constraint_exclusion = partition   # on, off, or partition
#cursor_tuple_fraction = 0.1        # range 0.0-1.0
#from_collapse_limit = 8
#join_collapse_limit = 8        # 1 disables collapsing of explicit
# JOIN clauses
#force_parallel_mode = off
#jit = on               # allow JIT compilation
#plan_cache_mode = auto         # auto, force_generic_plan or
# force_custom_plan
#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------
# - Where to Log -
#log_destination = 'stderr'     # Valid values are combinations of
# stderr, csvlog, syslog, and eventlog,
# depending on platform.  csvlog
# requires logging_collector to be on.
# This is used when logging to stderr:
#logging_collector = off        # Enable capturing of stderr and csvlog
# into log files. Required to be on for
# csvlogs.
# (change requires restart)
# These are only used if logging_collector is on:
#log_directory = 'log'          # directory where log files are written,
# can be absolute or relative to PGDATA
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'    # log file name pattern,
# can include strftime() escapes
#log_file_mode = 0600           # creation mode for log files,
# begin with 0 to use octal notation
#log_truncate_on_rotation = off     # If on, an existing log file with the
# same name as the new log file will be
# truncated rather than appended to.
# But such truncation only occurs on
# time-driven rotation, not on restarts
# or size-driven rotation.  Default is
# off, meaning append to existing files
# in all cases.
#log_rotation_age = 1d          # Automatic rotation of logfiles will
# happen after that time.  0 disables.
#log_rotation_size = 10MB       # Automatic rotation of logfiles will
# happen after that much log output.
# 0 disables.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
#syslog_sequence_numbers = on
#syslog_split_messages = on
# This is only relevant when logging to eventlog (win32):
# (change requires restart)
#event_source = 'PostgreSQL'
# - When to Log -
#log_min_messages = warning     # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   info
#   notice
#   warning
#   error
#   log
#   fatal
#   panic
#log_min_error_statement = error    # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   info
#   notice
#   warning
#   error
#   log
#   fatal
#   panic (effectively off)
#log_min_duration_statement = -1    # logs statements and their durations
# according to log_statement_sample_rate. -1 is disabled,
# 0 logs all statement, > 0 logs only statements running at
# least this number of milliseconds.
#log_statement_sample_rate = 1  # Fraction of logged statements over
# log_min_duration_statement. 1.0 logs all statements,
# 0 never logs.
# - What to Log -
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_error_verbosity = default      # terse, default, or verbose messages
#log_hostname = off
#log_line_prefix = '%m [%p] '       # special values:
#   %a = application name
#   %u = user name
#   %d = database name
#   %r = remote host and port
#   %h = remote host
#   %p = process ID
#   %t = timestamp without milliseconds
#   %m = timestamp with milliseconds
#   %n = timestamp with milliseconds (as a Unix epoch)
#   %i = command tag
#   %e = SQL state
#   %c = session ID
#   %l = session line number
#   %s = session start timestamp
#   %v = virtual transaction ID
#   %x = transaction ID (0 if none)
#   %q = stop here in non-session
#        processes
#   %% = '%'
# e.g. '<%u%%%d> '
#log_lock_waits = off           # log lock waits >= deadlock_timeout
#log_statement = 'none'         # none, ddl, mod, all
#log_replication_commands = off
#log_temp_files = -1            # log temporary files equal or larger
# than the specified size in kilobytes;
# -1 disables, 0 logs all temp files
#log_timezone = 'GMT'
#------------------------------------------------------------------------------
# PROCESS TITLE
#------------------------------------------------------------------------------
#cluster_name = ''          # added to process titles if nonempty
# (change requires restart)
#update_process_title = on
#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------
# - Query and Index Statistics Collector -
#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none         # none, pl, all
#track_activity_query_size = 1024   # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'
# - Monitoring -
#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
#log_statement_stats = off
#------------------------------------------------------------------------------
# AUTOVACUUM
#------------------------------------------------------------------------------
#autovacuum = on            # Enable autovacuum subprocess?  'on'
# requires track_counts to also be on.
#log_autovacuum_min_duration = -1   # -1 disables, 0 logs all actions and
# their durations, > 0 logs only
# actions running at least this number
# of milliseconds.
#autovacuum_max_workers = 3     # max number of autovacuum subprocesses
# (change requires restart)
#autovacuum_naptime = 1min      # time between autovacuum runs
#autovacuum_vacuum_threshold = 50   # min number of row updates before
# vacuum
#autovacuum_analyze_threshold = 50  # min number of row updates before
# analyze
#autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
# (change requires restart)
#autovacuum_multixact_freeze_max_age = 400000000    # maximum multixact age
# before forced vacuum
# (change requires restart)
#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
# autovacuum, in milliseconds;
# -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1  # default vacuum cost limit for
# autovacuum, -1 means use
# vacuum_cost_limit
#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------
# - Statement Behavior -
#client_min_messages = notice       # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   log
#   notice
#   warning
#   error
#search_path = '"$user", public'    # schema names
#row_security = on
#default_tablespace = ''        # a tablespace name, '' uses the default
#temp_tablespaces = ''          # a list of tablespace names, '' uses
# only default tablespace
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role = 'origin'
#statement_timeout = 0          # in milliseconds, 0 is disabled
#lock_timeout = 0           # in milliseconds, 0 is disabled
#idle_in_transaction_session_timeout = 0    # in milliseconds, 0 is disabled
#vacuum_freeze_min_age = 50000000
#vacuum_freeze_table_age = 150000000
#vacuum_multixact_freeze_min_age = 5000000
#vacuum_multixact_freeze_table_age = 150000000
#vacuum_cleanup_index_scale_factor = 0.1    # fraction of total number of tuples
# before index cleanup, 0 always performs
# index cleanup
#bytea_output = 'hex'           # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_fuzzy_search_limit = 0
#gin_pending_list_limit = 4MB
# - Locale and Formatting -
#datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
#timezone = 'GMT'
#timezone_abbreviations = 'Default'     # Select the set of available time zone
# abbreviations.  Currently, there are
#   Default
#   Australia (historical usage)
#   India
# You can create your own file in
# share/timezonesets/.
#extra_float_digits = 1         # min -15, max 3; any value >0 actually
# selects precise output mode
#client_encoding = sql_ascii        # actually, defaults to database
# encoding
# These settings are initialized by initdb, but they can be changed.
#lc_messages = 'C'          # locale for system error message
# strings
#lc_monetary = 'C'          # locale for monetary formatting
#lc_numeric = 'C'           # locale for number formatting
#lc_time = 'C'              # locale for time formatting
# default configuration for text search
#default_text_search_config = 'pg_catalog.simple'
# - Shared Library Preloading -
#shared_preload_libraries = ''  # (change requires restart)
#local_preload_libraries = ''
#session_preload_libraries = ''
#jit_provider = 'llvmjit'       # JIT library to use
# - Other Defaults -
#dynamic_library_path = '$libdir'
#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
#max_locks_per_transaction = 64     # min 10
# (change requires restart)
#max_pred_locks_per_transaction = 64    # min 10
# (change requires restart)
#max_pred_locks_per_relation = -2   # negative values mean
# (max_pred_locks_per_transaction
#  / -max_pred_locks_per_relation) - 1
#max_pred_locks_per_page = 2            # min 0
#------------------------------------------------------------------------------
# VERSION AND PLATFORM COMPATIBILITY
#------------------------------------------------------------------------------
# - Previous PostgreSQL Versions -
#array_nulls = on
#backslash_quote = safe_encoding    # on, off, or safe_encoding
#escape_string_warning = on
#lo_compat_privileges = off
#operator_precedence_warning = off
#quote_all_identifiers = off
#standard_conforming_strings = on
#synchronize_seqscans = on
# - Other Platforms and Clients -
#transform_null_equals = off
#------------------------------------------------------------------------------
# ERROR HANDLING
#------------------------------------------------------------------------------
#exit_on_error = off            # terminate session on any error?
#restart_after_crash = on       # reinitialize after backend crash?
#data_sync_retry = off          # retry or panic on failure to fsync
# data?
# (change requires restart)
#------------------------------------------------------------------------------
# CONFIG FILE INCLUDES
#------------------------------------------------------------------------------
# These options allow settings to be loaded from files other than the
# default postgresql.conf.
#include_dir = 'conf.d'         # include files ending in '.conf' from
# directory 'conf.d'
#include_if_exists = 'exists.conf'  # include file only if it exists
#include = 'special.conf'       # include file
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------
# Add settings for extensions here

рд╣реЗ рд╕рд░реНрд╡ рдЖрд╣реЗ, рдЖрдкрдг рдХрдорд╛рдВрдбрд╕рд╣ рдХрдВрдЯреЗрдирд░ рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛ docker-compose up -d. рдХрд┐рдВрд╡рд╛ рдХрдорд╛рдВрдбрд╕рд╣ рд╡реЗрдЧрд│реНрдпрд╛ рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ docker-compose up.

рддрд░, рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд, рдбреЗрдЯрд╛рдмреЗрд╕ рд▓реЙрдиреНрдЪ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ, рдлрдХреНрдд рддреНрдпрд╛рдВрдирд╛ рдПрдХрдореЗрдХрд╛рдВрдЪреЗ рдорд┐рддреНрд░ рдмрдирд╡рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдлрд╛рдЗрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯрдордзреНрдпреЗ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ: ormconfig.js:

ormconfig.js

const process = require('process');
const username = process.env.POSTGRES_USER || "postgres";
const password = process.env.POSTGRES_PASSWORD || "example";
module.exports = {
"type": "postgres",
"host": "localhost",
"port": 5432,
username,
password,
"database": "postgres",
"synchronize": true,
"dropSchema": false,
"logging": true,
"entities": [__dirname + "/src/**/*.entity.ts", __dirname + "/dist/**/*.entity.js"],
"migrations": ["migrations/**/*.ts"],
"subscribers": ["subscriber/**/*.ts", "dist/subscriber/**/.js"],
"cli": {
"entitiesDir": "src",
"migrationsDir": "migrations",
"subscribersDir": "subscriber"
}
}

рд╣реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди cli typeorm рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдИрд▓.

рдЪрд▓рд╛ рдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдХрдбреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ. рдУрд│реА 3 рдЖрдгрд┐ 4 рд╡рд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреВрди рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдорд┐рд│рддреЛ. рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрдиреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг (рджреЗрд╡, рд╕реНрдЯреЗрдЬ, рдкреНрд░реЛрдб рдЗ.) рдЕрд╕рддрд╛рдирд╛ рд╣реЗ рд╕реЛрдпреАрдЪреЗ рдЕрд╕рддреЗ. рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдЖрд╣реЗ рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ. рдЙрд░реНрд╡рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреНрд╖реБрд▓реНрд▓рдХ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдлрдХреНрдд рд╕рд░реНрд╡рд╛рдд рдордиреЛрд░рдВрдЬрдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВ:

  • рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭ - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реВ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рд╡рд╛ рдХреА рдирд╛рд╣реА рд╣реЗ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ. рдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рд╕рд╣ рд╕рд╛рд╡рдзрдЧрд┐рд░реА рдмрд╛рд│рдЧрд╛ рдЖрдгрд┐ рдЙрддреНрдкрд╛рджрдирд╛рдордзреНрдпреЗ рддреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВ рдирдХрд╛, рдЕрдиреНрдпрдерд╛ рдЖрдкрдг рдбреЗрдЯрд╛ рдЧрдорд╛рд╡рд╛рд▓. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдЖрдгрд┐ рдбреАрдмрдЧ рдХрд░рддрд╛рдирд╛ рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ. рдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рд▓рд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди, рддреБрдореНрд╣реА рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ schema:sync CLI TypeORM рд╡рд░реВрди.
  • dropSchema - рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рд╕реНрдХреАрдорд╛ рд░реАрд╕реЗрдЯ рдХрд░рд╛. рдорд╛рдЧреАрд▓ рдкреНрд░рдорд╛рдгреЗрдЪ, рд╣рд╛ рдкрд░реНрдпрд╛рдп рдХреЗрд╡рд│ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕ рдЖрдгрд┐ рдбреАрдмрдЧрд┐рдВрдЧ рджрд░рдореНрдпрд╛рди рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рд╡рд╛.
  • рд╕рдВрд╕реНрдерд╛ - рдореЙрдбреЗрд▓рдЪреЗ рд╡рд░реНрдгрди рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгрддреЗ рдорд╛рд░реНрдЧ рд╢реЛрдзрд╛рдпрдЪреЗ. рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдорд╛рд╕реНрдХрджреНрд╡рд╛рд░реЗ рд╢реЛрдз рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗ.
  • cli.entitiesDir рд╣реА рдбрд┐рд░реЗрдХреНрдЯрд░реА рдЖрд╣реЗ рдЬрд┐рдереЗ TypeORM CLI рд╡рд░реВрди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рдореЙрдбреЗрд▓реНрд╕ рдмрд╛рдп рдбреАрдлреЙрд▓реНрдЯ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реА рдЬрд╛рд╡реАрдд.

рдЖрдордЪреНрдпрд╛ рдиреЗрд╕реНрдЯ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ TypeORM рдЪреА рд╕рд░реНрд╡ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ TypeOrmModule ╨▓ AppModule. рддреНрдпрд╛. рдЖрдкрд▓реЗ AppModule рдЕрд╕реЗ рджрд┐рд╕реЗрд▓:

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import * as process from "process";
const username = process.env.POSTGRES_USER || 'postgres';
const password = process.env.POSTGRES_PASSWORD || 'example';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username,
password,
database: 'postgres',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

рддреБрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдЕрд╕реЗрд▓, рдкрджреНрдзрдд forRoot рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди ormconfig.ts рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдмрд╛рдХреА рдЖрд╣реЗ - package.json рдордзреНрдпреЗ TypeORM рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдХрд╛рд░реНрдпреЗ рдЬреЛрдбрд╛. рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рд╕реАрдПрд▓рдЖрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдиреЛрдбрдЬ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рд▓рддреЗ. рддрдерд╛рдкрд┐, рдЖрдордЪреЗ рд╕рд░реНрд╡ рдореЙрдбреЗрд▓реНрд╕ рдЖрдгрд┐ рд╕реНрдерд▓рд╛рдВрддрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреАрд▓. рдореНрд╣рдгреВрди, CLI рд╡рд╛рдкрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЖрдордЪреЗ рд╕реНрдерд▓рд╛рдВрддрд░ рдЖрдгрд┐ рдореЙрдбреЗрд▓реНрд╕ рдЯреНрд░рд╛рдиреНрд╕рдкрд┐рд▓реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ ts-node рдкреЕрдХреЗрдЬрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

yarn add -D ts-node

рддреНрдпрд╛рдирдВрддрд░, package.json рдордзреНрдпреЗ рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдбреНрд╕ рдЬреЛрдбрд╛:

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",
"migration:generate": "yarn run typeorm migration:generate -n",
"migration:create": "yarn run typeorm migration:create -n",
"migration:run": "yarn run typeorm migration:run"

TypeORM cli рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╣рд┐рд▓реА рдХрдорд╛рдВрдб, typeorm, ts-node wrapper рдЬреЛрдбрддреЗ. рдЙрд░реНрд╡рд░рд┐рдд рдХрдорд╛рдВрдб рд╣реЗ рд╕реЛрдпреАрд╕реНрдХрд░ рд╢реЙрд░реНрдЯрдХрдЯ рдЖрд╣реЗрдд рдЬреЗ рддреБрдореНрд╣реА, рдбреЗрд╡реНрд╣рд▓рдкрд░ рдореНрд╣рдгреВрди, рдЬрд╡рд│рдЬрд╡рд│ рджрд░рд░реЛрдЬ рд╡рд╛рдкрд░рд╛рд▓:
migration:generate тАФ рддреБрдордЪреНрдпрд╛ рдореЙрдбреЗрд▓рдордзреАрд▓ рдмрджрд▓рд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдерд▓рд╛рдВрддрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ.
migration:create - рд░рд┐рдХреНрдд рд╕реНрдерд▓рд╛рдВрддрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ.
migration:run - рд╕реНрдерд▓рд╛рдВрддрд░ рд╕реБрд░реВ рдХрд░рдгреЗ.
рдмрд░рдВ, рдЖрддрд╛ рддреЗрдЪ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдЖрд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЬреЗрд╕ рдЬреЛрдбрд▓реНрдпрд╛ рдЖрд╣реЗрдд, cli рдЖрдгрд┐ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреВрди рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ DBMS рд▓рд╛рдБрдЪ рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЖрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдд рддрд░реНрдХ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ.

CRUD рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ

рдлрдХреНрдд Nest рд╡рд╛рдкрд░реВрди, рддреБрдореНрд╣реА рдПрдкреАрдЖрдп рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдЦрд╛рджреА рд╕рдВрд╕реНрдерд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕, рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА, рдЕрдкрдбреЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рд╣рдЯрд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рд╣реЗ рд╕рдорд╛рдзрд╛рди рд╢рдХреНрдп рддрд┐рддрдХреЗ рд▓рд╡рдЪрд┐рдХ рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рддреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрд╡рд░реАрдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓, рддрд░ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЧрддреАрд╕рд╛рдареА рддреБрдореНрд╣реА рдЕрдиреЗрдХрджрд╛ рд▓рд╡рдЪрд┐рдХрддреЗрдЪрд╛ рддреНрдпрд╛рдЧ рдХрд░реВ рд╢рдХрддрд╛. рдЕрдиреЗрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдХрд╛рдЪреНрдпрд╛ рдбреЗрдЯрд╛ рдореЙрдбреЗрд▓рдЪреЗ рд╡рд░реНрдгрди рдХрд░реВрди CRUD рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛рдд. рдЖрдгрд┐ рдШрд░рдЯреЗ рдЕрдкрд╡рд╛рдж рдирд╛рд╣реА! рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреЕрдХреЗрдЬрджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реА рдЬрд╛рддреЗ @nestjsx/crud. рддреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЦреВрдк рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ:

  • рд╕реБрд▓рдн рд╕реНрдерд╛рдкрдирд╛ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди;
  • DBMS рд╕реНрд╡рд╛рддрдВрддреНрд░реНрдп;
  • рдлрд┐рд▓реНрдЯрд░, рдкреГрд╖реНрдард╛рдВрдХрди, рдХреНрд░рдорд╡рд╛рд░реА, рд▓реЛрдб рд╕рдВрдмрдВрдз рдЖрдгрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд╕реНрдерд╛, рдХреЕрд╢рд┐рдВрдЧ рдЗрддреНрдпрд╛рджреА рдХреНрд╖рдорддреЗрд╕рд╣ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛;
  • рдлреНрд░рдВрдЯ-рдПрдВрдбрд╡рд░ рд╡рд┐рдирдВрддреНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреЕрдХреЗрдЬ;
  • рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрджреНрдзрддреАрдВрдЪреЗ рд╕рд╣рдЬ рдУрд╡реНрд╣рд░рд░рд╛рдЗрдбрд┐рдВрдЧ;
  • рд▓рд╣рд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди;
  • swagger рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рд╕рдорд░реНрдерди.

рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдиреЗрдХ рдкреЕрдХреЗрдЬреЗрд╕рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ:

  • @nestjsx/crud - рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЛ рддреЗ рдореВрд▓рднреВрдд рдкреЕрдХреЗрдЬ рдХреНрд░реВрдб() рдорд╛рд░реНрдЧ рдирд┐рд░реНрдорд┐рддреА, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрдгрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдгрд╛рд╕рд╛рдареА;
  • @nestjsx/crud-request тАФ рдПрдХ рдкреЕрдХреЗрдЬ рдЬреЗ рд╕рдореЛрд░рдЪреНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреНрд╡реЗрд░реА рдмрд┐рд▓реНрдбрд░/рдкрд╛рд░реНрд╕рд░ рдкреБрд░рд╡рддреЗ;
  • @nestjsx/crud-typeorm тАФ TypeORM рд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдгрд╛рд╕рд╛рдареА рдкреЕрдХреЗрдЬ, рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рдШрдЯрдХрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА CRUD рдкрджреНрдзрддреАрдВрд╕рд╣ рдореВрд▓рднреВрдд TypeOrmCrudService рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рдпрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдордзреНрдпреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреЕрдХреЗрдЬреЗрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓ рдШрд░рдЯреЗjsx/crud рдЖрдгрд┐ рдШрд░рдЯреЗjsx/crud-typeorm. рдкреНрд░рдердо, рддреНрдпрд╛рдВрдирд╛ рдареЗрд╡реВрдпрд╛

yarn add @nestjsx/crud class-transformer class-validator

рдкреЕрдХреЗрдЯ рд╡рд░реНрдЧ-рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдорд░ ╨╕ рд╡рд░реНрдЧ-рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдХрд░реНрддрд╛ рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдордзреНрдпреЗ рдЕрдиреБрдХреНрд░рдореЗ рдореЙрдбреЗрд▓ рдЙрджрд╛рд╣рд░рдгреЗ рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдпреЗрдгрд╛рд░реНтАНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд┐рдпрдорд╛рдВрдЪреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд░реНрдгрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реА рдкреЕрдХреЗрдЬреЗрд╕ рдПрдХрд╛рдЪ рд▓реЗрдЦрдХрд╛рдЪреА рдЖрд╣реЗрдд, рддреНрдпрд╛рдореБрд│реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдорд╛рди рдЖрд╣реЗрдд.

CRUD рдЪреА рдереЗрдЯ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

рдЖрдореНрд╣реА рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЙрдбреЗрд▓ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдШреЗрдК. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдХрдбреЗ рдЦрд╛рд▓реАрд▓ рдлреАрд▓реНрдб рдЕрд╕рддреАрд▓: id, username, displayName, email. id - рд╕реНрд╡рдпрдВ-рд╡рд╛рдвреАрд╡ рдлреАрд▓реНрдб, email ╨╕ username - рдЕрджреНрд╡рд┐рддреАрдп рдлреАрд▓реНрдб. рд╣реЗ рд╕реЛрдкрдВ рдЖрд╣реЗ! рдЖрдордЪреНрдпрд╛ рдХрд▓реНрдкрдиреЗрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдиреЗрд╕реНрдЯ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдХрд░рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ.
рдкреНрд░рдердо рдЖрдкрдг рдПрдХ рдореЙрдбреНрдпреВрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ users, рдЬреЛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЕрд╕реЗрд▓. NestJS рдордзреАрд▓ cli рд╡рд╛рдкрд░реВ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рд░реВрдЯ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реВ nest g module users.

рдиреЗрд╕реНрдЯ рдЬреА рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреЗ

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects/nest-rest git:(master*)$ nest g module users
CREATE /src/users/users.module.ts (82 bytes)
UPDATE /src/app.module.ts (312 bytes)

рдпрд╛ рдореЙрдбреНрдпреВрд▓рдордзреНрдпреЗ рдЖрдкрдг рдПрдХ рд╕рдВрд╕реНрдерд╛ рдлреЛрд▓реНрдбрд░ рдЬреЛрдбреВ, рдЬрд┐рдереЗ рдЖрдкрд▓реНрдпрд╛рдХрдбреЗ рдпрд╛ рдореЙрдбреНрдпреВрд▓рдЪреЗ рдореЙрдбреЗрд▓ рдЕрд╕рддреАрд▓. рд╡рд┐рд╢реЗрд╖рддрдГ, рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЙрдбреЗрд▓рдЪреНрдпрд╛ рд╡рд░реНрдгрдирд╛рд╕рд╣ user.entity.ts рд╣реА рдлрд╛рдЗрд▓ рдпреЗрдереЗ рдЬреЛрдбреВрдпрд╛:

user.entity.ts

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: string;
@Column({unique: true})
email: string;
@Column({unique: true})
username: string;
@Column({nullable: true})
displayName: string;
}

рд╣реЗ рдореЙрдбреЗрд▓ рдЖрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рджреНрд╡рд╛рд░реЗ "рдкрд╛рд╣рд┐рд▓реЗ" рдЬрд╛рдгреНрдпрд╛рд╕рд╛рдареА, рддреЗ рдореЙрдбреНрдпреВрд▓рдордзреНрдпреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ UsersModule рдЖрдпрд╛рдд TypeOrmModule рдЦрд╛рд▓реАрд▓ рд╕рд╛рдордЧреНрд░реА:

user.module.ts

import { Module } from '@nestjs/common';
import { UsersController } from './controllers/users/users.controller';
import { UsersService } from './services/users/users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
@Module({
controllers: [UsersController],
providers: [UsersService],
imports: [
TypeOrmModule.forFeature([User])
]
})
export class UsersModule {}

рдореНрд╣рдгрдЬреЗрдЪ рдЗрдереЗ рдЖрдкрдг рдЖрдпрд╛рдд рдХрд░рддреЛ TypeOrmModule, рдЬреЗрдереЗ рдкрджреНрдзрдд рдкреЕрд░рд╛рдореАрдЯрд░ рдореНрд╣рдгреВрди forFeature рдЖрдореНрд╣реА рдпрд╛ рдореЙрдбреНрдпреВрд▓рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбреЗрд▓рдЪреА рд╕реВрдЪреА рд╕реВрдЪрд┐рдд рдХрд░рддреЛ.

рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХ рддрдпрд╛рд░ рдХрд░рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рд╕реНрдерд▓рд╛рдВрддрд░ рдпрдВрддреНрд░рдгрд╛ рдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдВрд╕рд╛рдареА рдХрд╛рдо рдХрд░рддреЗ. рдореЙрдбреЗрд▓рдордзреАрд▓ рдмрджрд▓рд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдерд▓рд╛рдВрддрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдорд╛рдВрдб рдЪрд╛рд▓рд╡рд╛рд╡реА рд▓рд╛рдЧреЗрд▓ npm run migration:generate -- CreateUserTable:

рд╕реНрдкреЙрдпрд▓рд░ рд╢реАрд░реНрд╖рдХ

$ npm run migration:generate -- CreateUserTable
Migration /home/dmitrii/projects/nest-rest/migrations/1563346135367-CreateUserTable.ts has been generated successfully.
Done in 1.96s.

рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрдерд▓рд╛рдВрддрд░ рд╕реНрд╡рд╣рд╕реНрддреЗ рд▓рд┐рд╣рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ рдирд╛рд╣реА, рд╕рд░реНрд╡рдХрд╛рд╣реА рдЬрд╛рджреВрдиреЗ рдШрдбрд▓реЗ. рд╣рд╛ рдЪрдорддреНрдХрд╛рд░ рдирд╛рд╣реА рдХрд╛! рддрдерд╛рдкрд┐, рддреЗ рд╕рд░реНрд╡ рдирд╛рд╣реА. рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдлрд╛рдЗрд▓рд╡рд░ рдПрдХ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛:

1563346135367-CreateUserTable.ts

import {MigrationInterface, QueryRunner} from "typeorm";
export class CreateUserTable1563346816726 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "user" ("id" SERIAL NOT NULL, "email" character varying NOT NULL, "username" character varying NOT NULL, "displayName" character varying, CONSTRAINT "UQ_e12875dfb3b1d92d7d7c5377e22" UNIQUE ("email"), CONSTRAINT "UQ_78a916df40e02a9deb1c4b75edb" UNIQUE ("username"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`DROP TABLE "user"`);
}
}

рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рдХреЗрд╡рд│ рд╕реНрдерд▓рд╛рдВрддрд░ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЪреА рдкрджреНрдзрддрдЪ рдЖрдкреЛрдЖрдк рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓реА рдирд╛рд╣реА, рддрд░ рддреА рдкрд░рдд рдЖрдгрдгреНрдпрд╛рдЪреА рдкрджреНрдзрдд рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдЭрд╛рд▓реА. рд╡рд┐рд▓рдХреНрд╖рдг!
рдлрдХреНрдд рд╣реЗ рд╕реНрдерд▓рд╛рдВрддрд░ рдЧреБрдВрдбрд╛рд│рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рд╣реЗ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢рд╛рдиреЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

npm run migration:run.

рддреЗрдЪ, рдЖрддрд╛ рд╕реНрдХреАрдорд╛ рдмрджрд▓ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рд╕реНрдерд▓рд╛рдВрддрд░рд┐рдд рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд.
рдкреБрдвреЗ, рдЖрдореНрд╣реА рдПрдХ рд╕реЗрд╡рд╛ рддрдпрд╛рд░ рдХрд░реВ рдЬреА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рд╡рд╛рд░рд╕рд╛ рдорд┐рд│рд╡реЗрд▓ TypeOrmCrudService. рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдШрдЯрдХрд╛рдЪреЗ рднрд╛рдВрдбрд╛рд░ рдореВрд│ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рдЪреНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░рд▓рд╛ рдкрд╛рд╕ рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ User рднрд╛рдВрдбрд╛рд░.

user.service.ts

import { Injectable } from '@nestjs/common';
import { TypeOrmCrudService } from '@nestjsx/crud-typeorm';
import { User } from '../../entities/user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
@Injectable()
export class UsersService extends TypeOrmCrudService<User>{
constructor(@InjectRepository(User) usersRepository: Repository<User>){
super(usersRepository);
}
}

рдЖрдореНрд╣рд╛рд▓рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░рдордзреНрдпреЗ рдпрд╛ рд╕реЗрд╡реЗрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓ users. рдХрдВрдЯреНрд░реЛрд▓рд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ рдЯрд╛рдЗрдк рдХрд░рд╛ nest g controller users/controllers/users

nest g рдирд┐рдпрдВрддреНрд░рдХ рд╡рд╛рдкрд░рдХрд░реНрддреЗ/рдирд┐рдпрдВрддреНрд░рдХ/рд╡рд╛рдкрд░рдХрд░реНрддреЗ

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects/nest-rest git:(master*)$ nest g controller users/controllers/users
CREATE /src/users/controllers/users/users.controller.spec.ts (486 bytes)
CREATE /src/users/controllers/users/users.controller.ts (99 bytes)
UPDATE /src/users/users.module.ts (188 bytes)

рдЪрд▓рд╛ рд╣рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдЙрдШрдбреВ рдЖрдгрд┐ рдереЛрдбреА рдЬрд╛рджреВ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реВ рдШрд░рдЯреЗjsx/crud. рдкреНрд░рддрд┐ рд╡рд░реНрдЧ UsersController рдЪрд▓рд╛ рдпрд╛рд╕рд╛рд░рдЦреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбреВрдпрд╛:

@Crud({
model: {
type: User
}
})

рдХреНрд░реВрдб рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЖрд╣реЗ рдЬреЛ рдХрдВрдЯреНрд░реЛрд▓рд░рд▓рд╛ рдореЙрдбреЗрд▓рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдкрджреНрдзрддреА рдЬреЛрдбрддреЛ. рдореЙрдбреЗрд▓ рдкреНрд░рдХрд╛рд░ рдлреАрд▓реНрдбрдордзреНрдпреЗ рджрд░реНрд╢рд╡рд┐рд▓рд╛ рдЖрд╣реЗ model.type рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди.
рджреБрд╕рд░реА рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рдЗрдВрдЯрд░рдлреЗрд╕рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреЗ CrudController<User>. "рдПрдХрддреНрд░рд┐рдд" рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдпрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕рддреЛ:

import { Controller } from '@nestjs/common';
import { Crud, CrudController } from '@nestjsx/crud';
import { User } from '../../entities/user.entity';
import { UsersService } from '../../services/users/users.service';
@Crud({
model: {
type: User
}
})
@Controller('users')
export class UsersController implements CrudController<User>{
constructor(public service: UsersService){}
}

рдЖрдгрд┐ рд╣реЗ рд╕рд░реНрд╡ рдЖрд╣реЗ! рдЖрддрд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЙрдбреЗрд▓рд╕рд╣ рдСрдкрд░реЗрд╢рдиреНрд╕рдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддреЛ! рдорд╛рдЭреНрдпрд╛рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╛рд╣реА? рдЪрд▓рд╛ рдЖрдордЪрд╛ рдЕрд░реНрдЬ рдХреГрддреАрдд рд╡рд╛рдкрд░реВрди рдкрд╣рд╛!

TestMace рдордзреНрдпреЗ рдХреНрд╡реЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдЖрдордЪреНрдпрд╛ рд╕реЗрд╡реЗрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА API рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА IDE рд╡рд╛рдкрд░реВ рдЯреЗрд╕реНрдЯрдореЗрд╕. рдЯреЗрд╕реНрдЯрдореЗрд╕ рдХрд╛? рд╕рдорд╛рди рдЙрддреНрдкрд╛рджрдирд╛рдВрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд, рддреНрдпрд╛рдЪреЗ рдЦрд╛рд▓реАрд▓ рдлрд╛рдпрджреЗ рдЖрд╣реЗрдд:

  • рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╣ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░реНрдп. рдпрд╛ рдХреНрд╖рдгреА, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреЗ рдЕрдиреЗрдХ рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗрдд, рдЬреНрдпрд╛рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднреВрдорд┐рдХрд╛ рдмрдЬрд╛рд╡рддреЗ: рдЕрдВрдЧрднреВрдд рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕, рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕, рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд▓. рдкреНрд░рддреНрдпреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╣реЗ рдЗрдирд╣реЗрд░рд┐рдЯрдиреНрд╕ рдореЗрдХреЕрдирд┐рдЭрдорд╕рд╛рдареА рд╕рдорд░реНрдерди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдиреЛрдбрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ;
  • рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрд╢рд┐рд╡рд╛рдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣рдЬрдкрдгреЗ рддрдпрд╛рд░ рдХрд░рд╛. рдпрд╛рдмрджреНрджрд▓ рдЦрд╛рд▓реА рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓;
  • рдорд╛рдирд╡реА-рд╡рд╛рдЪрдиреАрдп рд╕реНрд╡рд░реВрдк рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реАрдВрдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рдЬрддрди рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ;
  • рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛, рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╣рд╛рдпрд▓рд╛рдЗрдЯрд┐рдВрдЧ, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡реНрд╣реЕрд▓реНрдпреВ рд╣рд╛рдпрд▓рд╛рдЗрдЯрд┐рдВрдЧ;
  • Swagger рд╡рд░реВрди рдЖрдпрд╛рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдорддреЗрд╕рд╣ API рд╡рд░реНрдгрди рд╕рдорд░реНрдерди.

рдХрдорд╛рдВрдб рджреЗрдКрди рд╕рд░реНрд╡реНрд╣рд░ рд╕реБрд░реВ рдХрд░реВ npm start рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реВрдЪреАрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА, рдЖрдордЪреНрдпрд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдиреБрд╕рд╛рд░, url рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:3000/рд╡рд╛рдкрд░рдХрд░реНрддреЗ рд╡рд░реВрди рдорд┐рд│рд╡рддрд╛ рдпреЗрддреЗ. рдЪрд▓рд╛ рдпрд╛ url рд▓рд╛ рд╡рд┐рдирдВрддреА рдХрд░реВрдпрд╛.
TestMace рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рдирдВрддрд░ рддреБрдореНрд╣реА рдЕрд╕рд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╛рд╣реВ рд╢рдХрддрд╛:

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рдбрд╛рд╡реАрдХрдбреЗ рд░реВрдЯ рдиреЛрдбрд╕рд╣ рдПрдХ рдкреНрд░рдХрд▓реНрдк рд╡реГрдХреНрд╖ рдЖрд╣реЗ рдкреНрд░рдХрд▓реНрдк. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рдердо рд╡рд┐рдирдВрддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛. рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рддрдпрд╛рд░ рдХрд░реВ рд╡рд┐рдирдВрддреА рдЪрд░рдг рдиреЛрдб рд╣реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдиреЛрдбрдЪреНрдпрд╛ рд╕рдВрджрд░реНрдн рдореЗрдиреВрдордзреНрдпреЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдиреЛрдб рдЬреЛрдбрд╛ -> RequestStep.

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

URL рдлреАрд▓реНрдбрдордзреНрдпреЗ, localhost:3000/users рдкреЗрд╕реНрдЯ рдХрд░рд╛ рдЖрдгрд┐ рд╡рд┐рдирдВрддреА рдЪрд╛рд▓рд╡рд╛. рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рднрд╛рдЧрд╛рдордзреНрдпреЗ рд░рд┐рдХреНрдд рдЕреЕрд░реЗрд╕рд╣ рдХреЛрдб 200 рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓. рд╣реЗ рд╕рдордЬрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдЕрджреНрдпрд╛рдк рдХреЛрдгрд╛рд▓рд╛рд╣реА рдЬреЛрдбрд▓реЗрд▓реЗ рдирд╛рд╣реА.
рдЪрд▓рд╛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдпрд╛рд░ рдХрд░реВ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдЪрд░рдгрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕реЗрд▓:

  1. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ;
  2. рдирд╡реНрдпрд╛рдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдпрдбреАрд╕рд╛рдареА рд╡рд┐рдирдВрддреА;
  3. рдЪрд░рдг 1 рдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЖрдпрдбреАрджреНрд╡рд╛рд░реЗ рд╣рдЯрд╡рд┐рдгреЗ.

рддрд░ рдЪрд▓рд╛. рд╕реЛрдпреАрд╕рд╛рдареА, рдПрдХ рдиреЛрдб рддрдпрд╛рд░ рдХрд░реВ рдлреЛрд▓реНрдбрд░. рдореВрд▓рдд:, рд╣реЗ рдлрдХреНрдд рдПрдХ рдлреЛрд▓реНрдбрд░ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдкрдг рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрддрди рдХрд░реВ. рдлреЛрд▓реНрдбрд░ рдиреЛрдб рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдиреЛрдбрдЪреНрдпрд╛ рд╕рдВрджрд░реНрдн рдореЗрдиреВрдордзреВрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд╡рдбрд╛ рдиреЛрдб -> рдлреЛрд▓реНрдбрд░ рдЬреЛрдбрд╛. рдЪрд▓рд╛ рдиреЛрдбрд▓рд╛ рдХреЙрд▓ рдХрд░реВрдпрд╛ рдЪреЗрдХ рддрдпрд╛рд░ рдХрд░рд╛. рдиреЛрдбрдЪреНрдпрд╛ рдЖрдд рдЪреЗрдХ рддрдпрд╛рд░ рдХрд░рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдордЪреА рдкрд╣рд┐рд▓реА рд╡рд┐рдирдВрддреА рддрдпрд╛рд░ рдХрд░реВрдпрд╛. рдЪрд▓рд╛ рдирд╡реАрди рддрдпрд╛рд░ рдиреЛрдб рдХреЙрд▓ рдХрд░реВ рддрдпрд╛рд░-рд╡рд╛рдкрд░рдХрд░реНрддрд╛. рдореНрд╣рдгрдЬреЗрдЪ, рдпрд╛ рдХреНрд╖рдгреА рдиреЛрдб рдкрджрд╛рдиреБрдХреНрд░рдо рдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕реЗрд▓:

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рдЪрд▓рд╛ рдУрдкрди рдЯреЕрдмрд╡рд░ рдЬрд╛рдКрдпрд╛ рддрдпрд╛рд░-рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдиреЛрдб рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░реВрдпрд╛:

  • рд╡рд┐рдирдВрддреА рдкреНрд░рдХрд╛рд░ - POST
  • URL - рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:3000/рд╡рд╛рдкрд░рдХрд░реНрддреЗ
  • рдореБрдЦреНрдп рднрд╛рдЧ - рдореВрд▓реНрдпрд╛рд╕рд╣ JSON {"email": "[email protected]", "displayName": "New user", "username": "user"}

рд╣реА рд╡рд┐рдирдВрддреА рдкреВрд░реНрдг рдХрд░реВрдпрд╛. рдЖрдордЪрд╛ рдЕрд░реНрдЬ рдореНрд╣рдгрддреЛ рдХреА рд░реЗрдХреЙрд░реНрдб рддрдпрд╛рд░ рдЭрд╛рд▓рд╛ рдЖрд╣реЗ.

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рдмрд░рдВ, рд╣реА рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рддрдкрд╛рд╕реВрдпрд╛. рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдЪрд░рдгрд╛рдВрдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдпрдбреАрд╕рд╣ рдСрдкрд░реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╣реЗ рдкреЕрд░рд╛рдореАрдЯрд░ рдЬрддрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рдпрдВрддреНрд░рдгрд╛ рдкрд░рд┐рдкреВрд░реНрдг рдЖрд╣реЗ. рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕. рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕реЛрдмрдд рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдордЪреЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдкрд░реВ. рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдЪреНрдпрд╛ рдкрд╛рд░реНрд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯреЕрдмрдордзреНрдпреЗ, рд╕рдВрджрд░реНрдн рдореЗрдиреВрдордзреАрд▓ рдЖрдпрдбреА рдиреЛрдбрдЪреНрдпрд╛ рдкреБрдвреЗ, рдЖрдпрдЯрдо рдирд┐рд╡рдбрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рд▓рд╛ рдирд┐рдпреБрдХреНрдд рдХрд░рд╛. рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕рдордзреНрдпреЗ рддреБрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

  • рдиреЛрдб тАФ рдХреЛрдгрддреНрдпрд╛ рдкреВрд░реНрд╡рдЬрд╛рдВрдордзреНрдпреЗ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪреЗ. рдЪрд▓рд╛ рдирд┐рд╡рдбреВ рдпрд╛ рдЪреЗрдХ рддрдпрд╛рд░ рдХрд░рд╛
  • рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд╛рд╡ тАФ рдпрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдирд╛рд╡. рдЪрд▓рд╛ рдлреЛрди рдХрд░реВрдпрд╛ userId.

рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╢реА рджрд┐рд╕рддреЗ рддреЗ рдпреЗрдереЗ рдЖрд╣реЗ:

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рдЖрддрд╛, рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╣реА рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реНрдпрд╛рд╡рд░, рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдореВрд▓реНрдп рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рдЖрдгрд┐ рдХрд╛рд░рдг рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╢реНрд░реЗрдгреАрдмрджреНрдз рд╡рд╛рд░рд╕рд╛, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреНрдпрд╛ рдпрдВрддреНрд░рдгреЗрд╕ рд╕рдорд░реНрдерди рджреЗрддрд╛рдд userId рд╡рдВрд╢рдЬрд╛рдВрдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдИрд▓ рдЪреЗрдХ рддрдпрд╛рд░ рдХрд░рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╕реНрддрд░рд╛рдЪрд╛ рдиреЛрдб.
рд╣реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдЖрдореНрд╣рд╛рд▓рд╛ рдкреБрдвреАрд▓ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓. рдЕрд░реНрдерд╛рдд, рдЖрдореНрд╣реА рдирд╡реНрдпрд╛рдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рд╡рд┐рдирдВрддреА рдХрд░реВ. рдПрдХ рдиреЛрдб рдПрдХ рдореВрд▓ рдореНрд╣рдгреВрди рдЪреЗрдХ рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдореНрд╣реА рдПрдХ рд╡рд┐рдирдВрддреА рддрдпрд╛рд░ рдХрд░реВ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реНрдпрд╛рд╕ рддрдкрд╛рд╕рд╛ рдкреЕрд░рд╛рдореАрдЯрд░рд╕рд╣ url рд╕рдорд╛рди localhost:3000/users/${$dynamicVar.userId}. рдбрд┐рдЭрд╛рдЗрди рдкрд╣рд╛ ${variable_name} рд╣реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдореВрд▓реНрдп рдорд┐рд│рд╡рдд рдЖрд╣реЗ. рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рддреЗ рдорд┐рд│рд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ $dynamicVar, рдореНрд╣рдгрдЬреЗ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдордзреНрдпреЗ рдкреВрд░реНрдгрдкрдгреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреЗ userId рдЕрд╕реЗ рджрд┐рд╕реЗрд▓ ${$dynamicVar.userId}. рдЪрд▓рд╛ рд╡рд┐рдирдВрддреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реВ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рд╡рд┐рдирдВрддреА рдХреЗрд▓реА рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛.
рд╢реЗрд╡рдЯрдЪреА рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рд╣рдЯрд╡рдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХрд░рдгреЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЗрд╡рд│ рд╣рдЯрд╡рд┐рдгреНрдпрд╛рдЪреЗ рдСрдкрд░реЗрд╢рди рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареАрдЪ рдирд╛рд╣реА рддрд░ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рд╕реНрд╡рддрдГрд▓рд╛ рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдХрд╛рд░рдг... рдИрдореЗрд▓ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдлреАрд▓реНрдб рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╣реЗрдд. рддрд░, рдЪреЗрдХ-рдХреНрд░рд┐рдПрдЯ рдиреЛрдбрдордзреНрдпреЗ рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╣ рдбрд┐рд▓реАрдЯ-рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╡рд┐рдирдВрддреА рддрдпрд╛рд░ рдХрд░реВ

  • рд╡рд┐рдирдВрддреА рдкреНрд░рдХрд╛рд░ - рд╣рдЯрд╡рд╛
  • url - localhost:3000/users/${$dynamicVar.userId}

рдЪрд▓рд╛ рд▓реЙрдиреНрдЪ рдХрд░реВрдпрд╛. рдЖрдореНрд╣реАрдВ рд╡рд╛рдЯ рдкрд╣рддреЛ. рдЖрдореНрд╣реА рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рдЖрдирдВрдж рдШреЗрдд рдЖрд╣реЛрдд)

рдмрд░рдВ, рдЖрддрд╛ рдЖрдкрдг рд╣реА рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдзреАрд╣реА рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ. рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдВрджрд░реНрдн рдореЗрдиреВрдордзреВрди рдирд┐рд╡рдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдЪреЗрдХ рддрдпрд╛рд░ рдХрд░рд╛ рдиреЛрдб рдЖрдпрдЯрдо рдЪрд╛рд▓рд╡рд╛.

рдиреЗрд╕реНрдЯ, @nestjsx/crud рдЖрдгрд┐ TestMace рд╕рд╣ рдЬрд▓рдж CRUD рдирд┐рд░реНрдорд┐рддреА

рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреАрд▓ рдиреЛрдбреНрд╕ рдПрдХрд╛рдорд╛рдЧреВрди рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреАрд▓
рддреБрдореНрд╣реА рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рди рдХрд░реВрди рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХрд░реВ рд╢рдХрддрд╛ рдлрд╛рдЗрд▓ -> рдкреНрд░рдХрд▓реНрдк рдЬрддрди рдХрд░рд╛.

рдирд┐рд╖реНрдХрд░реНрд╖

рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рд╕рд╛рдзрдирд╛рдВрдЪреА рд╕рд░реНрд╡ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдордзреНрдпреЗ рдмрд╕реВ рд╢рдХрдд рдирд╛рд╣реАрдд. рдореБрдЦреНрдп рдЧреБрдиреНрд╣реЗрдЧрд╛рд░ рдореНрд╣рдгреВрди - рдкреЕрдХреЗрдЬ рдШрд░рдЯреЗjsx/crud - рдЦрд╛рд▓реАрд▓ рд╡рд┐рд╖рдп рдЙрдШрдб рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд:

  • рд╕рд╛рдиреБрдХреВрд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрдгрд┐ рдореЙрдбреЗрд▓рдЪреЗ рдкрд░рд┐рд╡рд░реНрддрди;
  • рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдЖрдгрд┐ рд╕рдореЛрд░ рддрд┐рдЪрд╛ рд╕реЛрдпреАрд╕реНрдХрд░ рд╡рд╛рдкрд░;
  • рдХреНрд░рдб рдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕рдордзреНрдпреЗ рдирд╡реАрди рдкрджреНрдзрддреА рдкреБрдиреНрд╣рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдЬреЛрдбрдгреЗ;
  • swagger рд╕рдорд░реНрдерди;
  • рдХреЕрд╢рд┐рдВрдЧ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди.

рддрдерд╛рдкрд┐, рд▓реЗрдЦрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реЗ рджреЗрдЦреАрд▓ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ рдХреА NestJS рд╕рд╛рд░рдЦреНрдпрд╛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЭ рдлреНрд░реЗрдорд╡рд░реНрдХрдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдЬрд▓рдж рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧрд╕рд╛рдареА рд╕рд╛рдзрдиреЗ рдЖрд╣реЗрдд. рдЖрдгрд┐ рдЕрд╕рд╛ рдорд╕реНрдд IDE рд╕рд╛рд░рдЦрд╛ рдЯреЗрд╕реНрдЯрдореЗрд╕ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рджрд┐рд▓реЗрд▓реА рдЧрддреА рд░рд╛рдЦрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╣ рдпрд╛ рд▓реЗрдЦрд╛рд╕рд╛рдареА рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЯреЗрд╕реНрдЯрдореЗрд╕, рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ https://github.com/TestMace/nest-rest. рдкреНрд░рдХрд▓реНрдк рдЙрдШрдбрдгреНрдпрд╛рд╕рд╛рдареА рдЯреЗрд╕реНрдЯрдореЗрд╕ рдлрдХреНрдд рдЕреЕрдкрдордзреНрдпреЗ рдХрд░рд╛ рдлрд╛рдЗрд▓ -> рдкреНрд░рдХрд▓реНрдк рдЙрдШрдбрд╛.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛