NestJS рдПрдХ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╣реА рд╡рд╛рд╕реНрддреБ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, NestJS рди рдХреЗрд╡рд▓ рдПрдХ рдмреИрдХрдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдиреНрдирдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рднреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
рдбреАрдбреАрдбреА ,
рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдФрд░ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ред рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд░рд▓ рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╕реЗ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╕рдВрдж рдЖрдкрдХреА рд╣реИ - рдЪрд╛рд╣реЗ рдЖрдк рдкреВрд░реЗ рдордВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдВ рдпрд╛ рдмрд╕ рдЗрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореИрдВрдиреЗ ASP.NET рдкрд░ рд▓рд┐рдЦрд╛, рдлрд┐рд░ AngularJS рдкрд░ рдПрдХ рджреГрд╢реНрдп рдерд╛ред рдЕрдХреНрдЯреВрдмрд░ 2016 рдореЗрдВ, рдХреЛрдгреАрдп рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ! рдлреНрд░рдВрдЯреЗрдВрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛, рдЖрдк рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдиреЛрдб рдкрд░ рд╡рд┐рдХрд╛рд╕ (рдШреЛрдВрд╕рд▓реЗ рдкрд░ рд╡рд┐рдХрд╛рд╕), рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣рд╛рдВ рддрдХ
рдХрд┐ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреЛрдП рдореЗрдВ рдЕрдЪреНрдЫреА рдкреНрд░рдерд╛рдУрдВ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рднреА
рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ ред рд▓реЗрдХрд┐рди NestJS рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред
NestJS, рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ (рдпрд╣ рдЬреЗрдПрд╕ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ), рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред
NestJS рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?NestJS рдиреЗ рд╣реБрдб рдХреЗ рддрд╣рдд рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд┐рдпрд╛ рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЗрд╕реНрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдПрдХ рдордЬрдмреВрдд рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд▓рд┐рдпрд╛ рдФрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдЫреЛрдЯреА рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
git clone https://github.com/nestjs/typescript-starter.git project
Server.ts рдореЗрдВ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './modules/app.module'; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000); } bootstrap();
рдареАрдХ рд╣реИ, рдлрд┐рд░ npm рд░рди рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкреЛрд░реНрдЯ 3000 рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЗрдЦреЗрдВред
NestJS рдХрд┐рд╕рд╕реЗ рдмрдирд╛ рд╣реИ?рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓реЗрдЦрдХ рдХреЛрдгреАрдп рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдереЗ, рдФрд░ рдиреЗрд╕реНрдЯрдЬреЗрдПрд╕ рдХреЛрдгреАрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдорд╛рди рдереЗ, рдЦрд╛рд╕рдХрд░ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВред
рдирд┐рдпрдВрддреНрд░рдХреЛрдВрдирд┐рдпрдВрддреНрд░рдХ рдкрд░рдд рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрдВрддреНрд░рдХ рдЙрджрд╛рд╣рд░рдг:
import { Controller, Get } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll() { return []; } }
рдкреНрд░рджрд╛рддрд╛рдУрдВрд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд╛рддрд╛ рд╣реИ - рд╕реЗрд╡рд╛, рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА, рдлреИрдХреНрдЯрд░реА, рд╣реЗрд▓реНрдкрд░, рдЖрджрд┐ред рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдЕрдиреНрдп рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдгреАрдп рдХреА рднрд╛рд╖рд╛ рдХрд╣рддреЗ рд╣реИрдВ - рдпрд╣ рд╕рдм `@ рдЗрдВрдЬреЗрдХреНрдЯреЗрдмрд▓ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реЗрд╡рд╛:
import { Injectable } from '@nestjs/common'; import { Cat } from './interfaces/cat.interface'; @Injectable() export class CatsService { private readonly cats: Cat[] = []; create(cat: Cat) { this.cats.push(cat); } findAll(): Cat[] { return this.cats; } }
рдореЙрдбреНрдпреВрд▓рдореЙрдбреНрдпреВрд▓
рдореЙрдбреНрдпреВрд▓ () рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд╣реИред
рдореЙрдбреНрдпреВрд▓ () рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдиреЗрд╕реНрдЯ рдЖрд╡реЗрджрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдиреЗрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдореЙрдбреНрдпреВрд▓, рд░реВрдЯ рдореЙрдбреНрдпреВрд▓ рд╣реЛрддрд╛ рд╣реИред рд░реВрдЯ рдореЙрдбреНрдпреВрд▓ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдиреЗрд╕реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреЗрдбрд╝ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░реВрдЯ рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдореЙрдбреНрдпреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдХрдЯрддрд╛ рд╣реИред рдиреЗрд╕реНрдЯ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╕рдорд╛рди рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; @Module({ controllers: [CatsController], components: [CatsService], }) export class CatsModule {}
рдЧрддрд┐рд╢реАрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛рдиреЗрд╕реНрдЯ рдореЙрдбреНрдпреВрд▓рд░ рдкреНрд░рдгрд╛рд▓реА рдЧрддрд┐рд╢реАрд▓ рдореЙрдбреНрдпреВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдпрд╛рд╕ рдХреЗ рдХрд╕реНрдЯрдо рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪрд▓рд┐рдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ DatabaseModule рдкрд░:
import { Module, DynamicModule } from '@nestjs/common'; import { createDatabaseProviders } from './database.providers'; import { Connection } from './connection.component'; @Module({ components: [Connection], }) export class DatabaseModule { static forRoot(entities = [], options?): DynamicModule { const providers = createDatabaseProviders(options, entities); return { module: DatabaseModule, components: providers, exports: providers, }; } }
рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдШрдЯрдХ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ - рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдШрдЯрдХред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЧрддрд┐рд╢реАрд▓ рдореЙрдбреНрдпреВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдШрдЯрдХреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдлрд┐рд░ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕рдорд╛рдбреНрдпреВрд▓ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import { Module } from '@nestjs/common'; import { DatabaseModule } from './database/database.module'; import { User } from './users/entities/user.entity'; @Module({ imports: [ DatabaseModule.forRoot([User]), ], }) export class ApplicationModule {}
рд╡реИрд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдВрдд
рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
MiddlewaresMiddlewares рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВред
import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common'; @Injectable() export class LoggerMiddleware implements NestMiddleware { resolve(...args: any[]): MiddlewareFunction { return (req, res, next) => { console.log('Request...'); next(); }; } }
рдЕрдкрд╡рд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░рдиреЗрд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдкрд╡рд╛рдж рдкрд░рдд рд╣реИ, рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЗ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдкрд╡рд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИ (HttpException рдирд╣реАрдВ рд╣реИ рдпрд╛ рдПрдХ рд╡рд░реНрдЧ рдЬреЛ HttpException рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ), рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ:
{ "statusCode": 500, "message": "Internal server error" }
рдкрд╛рдЗрдкреНрд╕рдкрд╛рдЗрдк рдХреЛ рдкрд╛рдЗрдкрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common'; @Injectable() export class ValidationPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { return value; } }
рдкрд╛рдЗрдк рдЗрдирдкреБрдЯ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рдЙрдирдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
@Post() @UsePipes(new ValidationPipe(createCatSchema)) async create(@Body() createCatDto: CreateCatDto) { this.catsService.create(createCatDto); }
рдпрд╛ рдЖрдк рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╛рдЗрдк рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
async function bootstrap() { const app = await NestFactory.create(ApplicationModule); app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); } bootstrap();
рдЧрд╛рд░реНрдбрдЧрд╛рд░реНрдб рдХреЛ CanActivate рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧрд╛рд░реНрдб рдХреА рдкреВрд░реА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред рд╡реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рдорд╛рд░реНрдЧ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред
@Injectable() export class RolesGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> {
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдПрд╕реНрдкреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдПрдУрдкреА) рддрдХрдиреАрдХ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИрдВред рд╡реЗ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
- рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ / рдмрд╛рдж рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдмрд╛рдБрдзреЗрдВ;
- рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ;
- рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХрдиреНрд╡рд░реНрдЯ
- рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрдпрдирд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
MikroservisyNest Microservice рд╕рд┐рд░реНрдл рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд▓реЗрдпрд░ (HTTP рдирд╣реАрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдиреЗрд╕реНрдЯ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - рдЯреАрд╕реАрдкреА рдФрд░ рд░реЗрдбрд┐рд╕ рдкрдм / рд╕рдм, рд▓реЗрдХрд┐рди рдирдИ рдкрд░рд┐рд╡рд╣рди рд░рдгрдиреАрддрд┐ рдХреЛ рдХрд╕реНрдЯрдордЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯрд╕реНрдЯреНрд░реЗрдЧреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдЖрдк рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './modules/app.module'; import { Transport } from '@nestjs/microservices'; async function bootstrap() { const app = await NestFactory.createMicroservice(ApplicationModule, { transport: Transport.TCP, }); app.listen(() => console.log('Microservice is listening')); } bootstrap();
рдиреЗрд╕реНрдЯ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред рдПрдХ рдкреИрдЯрд░реНрди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп, рдПрдХ рд╡рд╕реНрддреБ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
import { Controller } from '@nestjs/common'; import { MessagePattern } from '@nestjs/microservices'; @Controller() export class MathController { @MessagePattern({ cmd: 'sum' }) sum(data: number[]): number { return (data || []).reduce((a, b) => a + b); } }
рдФрд░ microservices рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
@Client({ transport: Transport.TCP, port: 5667 }) client: ClientProxy;
рдФрд░ рдпрд╣рд╛рдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛:
@Get() call(): Observable<number> { const pattern = { cmd: 'sum' }; const data = [1, 2, 3, 4, 5]; return this.client.send<number>(pattern, data); }
NestJS рдФрд░ Angular рдЗрддрдиреА рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдПрдирдЬреА рд╕рдореНрдореЗрд▓рдиреЛрдВ рдФрд░ рдмреИрдардХреЛрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, nrwl рдЯреАрдо рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдиреЗ nx рдореЗрдВ nestjs рдЯреЗрдореНрдкрд▓реЗрдЯ
рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ ред
ng g node-app nestjs-app -framework nestjs
NestJS рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдкрд░рд┐рдкрдХреНрд╡ рд╣реИ, рдФрд░ рдХрдИ рдХрдВрдкрдирд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИрдВред
рдЕрднреА рдЙрддреНрдкрд╛рджрди рдореЗрдВ NestJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреМрди рдХрд░ рд░рд╣рд╛ рд╣реИ?рд╕реНрд╡рдпрдВ рдврд╛рдБрдЪрд╛:
https://github.com/nestjs/nestрдХрдИ рд╢рд╛рдВрдд
рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ рдпрд╣рд╛рдБ:
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛- nestjsрдиреЗрд╕реНрдЯрдЬреЗрдПрд╕ рдХрд╛ рд░реВрд╕реА рднрд╛рд╖реА рд╕рдореБрджрд╛рдп рдПрдХ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо
https://t.me/nest_ru рдореЗрдВNestJS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯредрдФрд░ рд╣рд╛рдВ,
@ngFanatic рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдЪреИрдирд▓ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ рдЬрд╣рд╛рдВ NestJS рдФрд░ Angular рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦрдмрд░ рд╣реИред
PS: рдпрд╣ NestJS рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдПрдХ рд╕рд╛рд▓ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд╣реЛрдЧрд╛ред