MEETUP NEST FRAMEWORK APIs com Node e TypeScript
Objetivos: - Consolidar seus conhecimentos em APIs - Melhorar a organização do código - Aplicar padrões de mercado MEETUP NEST FRAMEWORK APIs com Node e TypeScript
Meet the host: André Baltieri Microsoft MVP e CEO balta.io Head of People na ESX
VEM PRA ESX!!! #TEMOSVAGAS vagas@esx.com.br
Por que mudar?
Introdução: - Motivações do uso de Node - Motivações do uso de TypeScript - Motivações do uso do Nest Framework Ainda MVC?
Prós: - Completo - Baseado no modelo “Angular” - Utiliza TypeScript - Suporta GraphQL, CQRS, Microsserviços Nest Framework Contras: - Conteúdo Técnico Online - Suporte
Setup Pré-Requisitos: - Visual Studio Code ou outro editor de código de sua preferência - Hyper ou outro terminal de sua preferência - Node 8.9.0 ou superior code npm i -g @nestjs/cli nest new minhaapi
Estrutura do Projeto Core Files - Os principais arquivos ficarão na pasta src. code src app.controller.ts app.module.ts main.ts
Estrutura do Projeto Main.ts - Arquivo principal da aplicação, é nele que tudo é criado/iniciado. App.Module.ts - A aplicação precisa ter pelo menos 1 módulo, este é o padrão (Raiz). App.Controller.ts - Controller padrão que vem como exemplo
Executando a API code npm start npm run start:dev Resumo - Podemos executar a aplicação utilizando os comandos abaixo.
Controllers Resumo - São responsáveis por receber requisições, trata-las e devolver respostas. - Utilizam um decorador chamado @Controller. code nest g controller MeuController
Rotas Resumo - São baseadas nos nomes dos controladores. - Fazem uso dos decoradores @Get, @Post, @Put e @Delete para compor a rota
Request Object Resumo - Toda chamada a um controlador recebe um objeto (Requisição). - Este objeto em sí, representa a requisição HTTP. - Na maioria das vezes não será necessário manipular este objeto. - Podemo utilizar decoradores específicos ao invés disso.
Dedicated Decorators @Request() req @Response() res @Next() next @Session() req.session @Param(param?: string) req.params / req.params[param] @Body(param?: string) req.body / req.body[param] @Query(param?: string) req.query / req.query[param] @Headers(param?: string) req.headers / req.headers[param]
Route Wildcards Resumo - Podemos definir “coringas” nas rotas. Exemplos - http://localhost:3000/abcd - http://localhost:3000/ab_cd - http://localhost:3000/abecd Outros Caracteres - Também podemos utilizar outros caracteres, como ?, +, * e (), derivados das expressões regulares. code @Get(“ab*cd”)
Status Code Resumo - Por padrão, o retorno é sempre 200, mas podemos alterá-lo facilmente utilizando o decorador @HttpCode(CODE). code @HttpCode(201)
Headers Resumo - Podemos especificar cabeçalhos customizados para as respostas, utilizando o decorador @Header(CHAVE, VALOR). code @Header(‘Cache-Control’, ‘none’)
Parâmetros de Rotas Resumo - Podemos especificar que uma rota deve receber um parâmetro utilizando :NOMEDOPARAMETRO e posteriormente, recebe-lo utilizando o decorador @Param. code @Get(':id') findOne(@Param() params) { console.log(params.id); return `This action returns a #${params.id} cat`; }
Parâmetros de Rotas Resumo - Podemos especificar que uma rota deve receber um parâmetro utilizando :NOMEDOPARAMETRO e posteriormente, recebe-lo utilizando o decorador @Param. code @Get(':id') findOne(@Param('id') id) { return `This action returns a #${id} cat`; }
Data Transfer Objects Resumo - Podemos criar objetos de entrada, que serão automaticamente convertidos (Como no ASP.NET Core/C#) e configurados nos parâmetros. code export class CreateCustomerDto { public name: string; public age: number; }
Data Transfer Objects Resumo - Podemos criar objetos de entrada, que serão automaticamente convertidos (Como no ASP.NET Core/C#) e configurados nos parâmetros. code @Post() create(@Body() dto: CreateCustomerDto) { return ‘Criado’; }
DEMO {crud}
Executando Resumo - Com tudo pronto, precisamos informar ao módulo raiz que temos um controlador. code import { Module } from '@nestjs/common'; import { MeuController } from ‘./controllers/meu.controller'; @Module({ controllers: [MeuController], }) export class ApplicationModule {}
DEMO {Postman}
Providers Resumo - Basicamente, qualquer coisa pode ser considerada um Provider, seja ele um serviço, um repositório ou outro item. - Os Providers permitem injetar classes em outras classes, trazendo um maior desacoplamento e gerenciando dependências automaticamente. - Na verdade, um Provider nada mais é do que uma classe decorada com @Injectable().
Services Resumo - São Providers que encapsulam métodos e podem ser re-utilizados em diversas classes (Normalmente em controladores).
Services code import { Injectable } from '@nestjs/common'; import { Customer } from ‘./entities/customer'; @Injectable() export class CustomerService { private readonly customers: Customer[] = []; create(customer: customer) { this.customers.push(customer); } }
Services code import { Controller, Get, Post, Body } from '@nestjs/common'; import { Customer } from ‘./entities/customer'; import { CustomerService } from ‘./customer.service’; @Controller(‘customers') export class CustomerController { constructor(private readonly service: CustomerService) {} @Post() async create(@Body() customer: Customer) { this.service.create(customer); } }
Injeção de Dependência Resumo - O que um controlador precisa para trabalhar. - Não devemos nos preocupar com itens que não da nossa responsabilidade. - Criamos dependências de itens externos. - São injetados via construtor. - Nest resolve automaticamente.
Scope Resumo - Com tudo pronto, basta informar ao módulo sobre o serviço criado.
Scope code import { Module } from '@nestjs/common'; import { CustomerController } from ‘./controllers/customer.controller'; import { CustomerService } from ‘./services/customer.service'; @Module({ controllers: [CustomerController], providers: [CustomerService], }) export class ApplicationModule {}
Dúvidas? hello@balta.io

Criando APIs com Node e TypeScript

  • 2.
  • 3.
    Objetivos: - Consolidar seusconhecimentos em APIs - Melhorar a organização do código - Aplicar padrões de mercado MEETUP NEST FRAMEWORK APIs com Node e TypeScript
  • 4.
    Meet the host: André Baltieri MicrosoftMVP e CEO balta.io Head of People na ESX
  • 5.
  • 6.
  • 7.
    Introdução: - Motivações douso de Node - Motivações do uso de TypeScript - Motivações do uso do Nest Framework Ainda MVC?
  • 8.
    Prós: - Completo - Baseadono modelo “Angular” - Utiliza TypeScript - Suporta GraphQL, CQRS, Microsserviços Nest Framework Contras: - Conteúdo Técnico Online - Suporte
  • 9.
    Setup Pré-Requisitos: - Visual StudioCode ou outro editor de código de sua preferência - Hyper ou outro terminal de sua preferência - Node 8.9.0 ou superior code npm i -g @nestjs/cli nest new minhaapi
  • 10.
    Estrutura do Projeto CoreFiles - Os principais arquivos ficarão na pasta src. code src app.controller.ts app.module.ts main.ts
  • 11.
    Estrutura do Projeto Main.ts -Arquivo principal da aplicação, é nele que tudo é criado/iniciado. App.Module.ts - A aplicação precisa ter pelo menos 1 módulo, este é o padrão (Raiz). App.Controller.ts - Controller padrão que vem como exemplo
  • 12.
    Executando a API code npmstart npm run start:dev Resumo - Podemos executar a aplicação utilizando os comandos abaixo.
  • 13.
    Controllers Resumo - São responsáveispor receber requisições, trata-las e devolver respostas. - Utilizam um decorador chamado @Controller. code nest g controller MeuController
  • 14.
    Rotas Resumo - São baseadasnos nomes dos controladores. - Fazem uso dos decoradores @Get, @Post, @Put e @Delete para compor a rota
  • 15.
    Request Object Resumo - Todachamada a um controlador recebe um objeto (Requisição). - Este objeto em sí, representa a requisição HTTP. - Na maioria das vezes não será necessário manipular este objeto. - Podemo utilizar decoradores específicos ao invés disso.
  • 16.
    Dedicated Decorators @Request() req @Response()res @Next() next @Session() req.session @Param(param?: string) req.params / req.params[param] @Body(param?: string) req.body / req.body[param] @Query(param?: string) req.query / req.query[param] @Headers(param?: string) req.headers / req.headers[param]
  • 17.
    Route Wildcards Resumo - Podemosdefinir “coringas” nas rotas. Exemplos - http://localhost:3000/abcd - http://localhost:3000/ab_cd - http://localhost:3000/abecd Outros Caracteres - Também podemos utilizar outros caracteres, como ?, +, * e (), derivados das expressões regulares. code @Get(“ab*cd”)
  • 18.
    Status Code Resumo - Porpadrão, o retorno é sempre 200, mas podemos alterá-lo facilmente utilizando o decorador @HttpCode(CODE). code @HttpCode(201)
  • 19.
    Headers Resumo - Podemos especificarcabeçalhos customizados para as respostas, utilizando o decorador @Header(CHAVE, VALOR). code @Header(‘Cache-Control’, ‘none’)
  • 20.
    Parâmetros de Rotas Resumo -Podemos especificar que uma rota deve receber um parâmetro utilizando :NOMEDOPARAMETRO e posteriormente, recebe-lo utilizando o decorador @Param. code @Get(':id') findOne(@Param() params) { console.log(params.id); return `This action returns a #${params.id} cat`; }
  • 21.
    Parâmetros de Rotas Resumo -Podemos especificar que uma rota deve receber um parâmetro utilizando :NOMEDOPARAMETRO e posteriormente, recebe-lo utilizando o decorador @Param. code @Get(':id') findOne(@Param('id') id) { return `This action returns a #${id} cat`; }
  • 22.
    Data Transfer Objects Resumo -Podemos criar objetos de entrada, que serão automaticamente convertidos (Como no ASP.NET Core/C#) e configurados nos parâmetros. code export class CreateCustomerDto { public name: string; public age: number; }
  • 23.
    Data Transfer Objects Resumo -Podemos criar objetos de entrada, que serão automaticamente convertidos (Como no ASP.NET Core/C#) e configurados nos parâmetros. code @Post() create(@Body() dto: CreateCustomerDto) { return ‘Criado’; }
  • 24.
  • 25.
    Executando Resumo - Com tudopronto, precisamos informar ao módulo raiz que temos um controlador. code import { Module } from '@nestjs/common'; import { MeuController } from ‘./controllers/meu.controller'; @Module({ controllers: [MeuController], }) export class ApplicationModule {}
  • 26.
  • 27.
    Providers Resumo - Basicamente, qualquercoisa pode ser considerada um Provider, seja ele um serviço, um repositório ou outro item. - Os Providers permitem injetar classes em outras classes, trazendo um maior desacoplamento e gerenciando dependências automaticamente. - Na verdade, um Provider nada mais é do que uma classe decorada com @Injectable().
  • 28.
    Services Resumo - São Providersque encapsulam métodos e podem ser re-utilizados em diversas classes (Normalmente em controladores).
  • 29.
    Services code import { Injectable} from '@nestjs/common'; import { Customer } from ‘./entities/customer'; @Injectable() export class CustomerService { private readonly customers: Customer[] = []; create(customer: customer) { this.customers.push(customer); } }
  • 30.
    Services code import { Controller,Get, Post, Body } from '@nestjs/common'; import { Customer } from ‘./entities/customer'; import { CustomerService } from ‘./customer.service’; @Controller(‘customers') export class CustomerController { constructor(private readonly service: CustomerService) {} @Post() async create(@Body() customer: Customer) { this.service.create(customer); } }
  • 31.
    Injeção de Dependência Resumo -O que um controlador precisa para trabalhar. - Não devemos nos preocupar com itens que não da nossa responsabilidade. - Criamos dependências de itens externos. - São injetados via construtor. - Nest resolve automaticamente.
  • 32.
    Scope Resumo - Com tudopronto, basta informar ao módulo sobre o serviço criado.
  • 33.
    Scope code import { Module} from '@nestjs/common'; import { CustomerController } from ‘./controllers/customer.controller'; import { CustomerService } from ‘./services/customer.service'; @Module({ controllers: [CustomerController], providers: [CustomerService], }) export class ApplicationModule {}
  • 35.

Notas do Editor

  • #2 Abertura // instrudução
  • #3 Tela de apresentação do curso
  • #4 Conheça o instrutor
  • #5 Conheça o instrutor