APIs e Microsserviços

15 dez, 2017

Yeoman: Criando API Node.js com TypeScript, JWT e MongoDB

Publicidade

Recentemente eu precisei criar algumas API’s para empresa onde trabalho e como estamos adotando as tecnologias Node.js com TypeScript, acabamos perdendo algum tempo para configurar a nossa estrutura toda vez que iniciamos um novo projeto.

Bom, pensando em otimizar esse passo, eu criei um pacote e subi no portal NPM para que com apenas alguns passos, tenhamos uma API configurada com Node.js, TypeScript, MongoDB e o JWT para autenticação.

Caso você queira ver a versão final do código que eu utilizei para criar esse pacote, segue o seu link no GitHub.

Para esse artigo, baixaremos esse pacote via gerenciador de pacotes do Node.js o NPM e navegar pela estrutura que iremos gerar a partir do pacote ts-api.

Baixando os pacotes

Nosso primeiro passo será baixar os seguintes pacotes:

npm install -g yo
npm install -g generator-ts-api

Em seguida, devemos executar o comando yo ts-api, para criarmos nosso projeto. O comando ts-api é o nome do pacote que nós baixamos acima. Podemos ver o resultado da execução desse comando na imagem abaixo:

Preencha o prompt com o nome que deseja para seu projeto. Esse passo ira demorar um pouco para finalizar, pois ele além de criar toda estrutura do nosso projeto, irá baixar os pacotes necessários para nossa aplicação, que estão configurados nas dependências do nosso arquivo package.json.

Estrutura do projeto

Para os próximos passos precisaremos de uma IDE, para esse artigo eu irei utilizar o Visual Studio Code (VS Code), mas você pode utilizar um de sua preferência.

Com o projeto aberto na sua IDE, vamos navegar pela sua estrutura de pastas e entender quais arquivos foram criados. Mas antes, execute o comando npm run copile, ele irá fazer o transpiler do TypeScript. Após esse passo, teremos a seguinte estrutura:

Estrutura do projeto

Vamos entender ela navegando por seus diretórios, começando pelo dist:

  • dist: diretório que nós configuramos no arquivo tsconfig para gerar os nossos arquivos .js.
  • controllers: pensando em uma aplicação MVC, seria o local onde configuramos as nossas rotas. Nesse primeiro momento, nós deixamos como default a UserController.
  • models: ainda pensando no conceito MVC, aqui seria o local das nossas Models. Para nossa estrutura, estamos utilizando ela para criar os Schemas do MongoDB.
  • repositories: em uma V2 irei implementar o Repositório Pattern, que nem utilizamos no .NET, mas para essa versão está só mapeando Schema com o MongoDB.
  • routes: para que nossas controllers não fiquem muito grandes, nós criamos e colocamos nossas regras dentro de routes, lá nós recebemos as requisições, tratamos e retornamos para nossa Controller.
  • app: esse é o arquivo de configuração do nosso projeto, aqui nós importamos todos os nossos pacotes/modulos, configuramos as nossas rotas/middlers e como iremos trabalhar, se iremos utilizar Auth ou não. Nesse arquivo, nós damos o start em nosso DB e também configuramos ele.
  • server: Primeiro arquivo que é chamado na nossa aplicação. Nele, nós configuramos a porta que iremos utilizar e verificamos se nosso banco de dados está configurado corretamente ou se aconteceu algum crash em nossa APP.
  • tsconfig: para essa V1, estamos utilizando o ES5, mas para v2, iremos criar uma fluxo para que o usuário escolha a versão que deseja para o ECMAScript.

Config: dentro desse diretório nós temos 3 arquivos: auth.ts, configs.ts, db.ts.

  • auth: arquivo de configuração do JWT, nesse, nós verificamos o header da request e validamos se está com o token. Caso esteja, validamos ele.
  • configs: arquivo de configuração para variáveis de ambiente. Nesse primeiro momento estamos utilizando para a secret do JWT.
  • db: arquivo de configuração do nosso banco de dados. Nele, nós temos a nossa string de conexão e as configurações e validações necessárias para trabalharmos com o MongoDB.

Testando o projeto

Para que possamos testar o nosso projeto, basta executar o comando npm start, ele irá abrir o nosso projeto na porta 3040. Podemos ver na imagem abaixo o log que ele nos gerou:

Executando o projeto

Notem que ele está nos avisando que o mongo está desconectado, ele deu essa mensagem porque eu estou utilizando o mongo com o Docker e nesse momento ele está parado.

Testando as Rotas

O projeto já vem com o CORS habilitado, caso você acesse o endereço http://localhost:3040/ pode observar que ele entrou na nossa default, essa rota está liberada. Agora para que possamos testar o JWT, tente acessar a rota /api/v1/users. Podemos ver o retorno 403 que recebemos nessa requisição na imagem abaixo:

Validando a Rota

Nós recebemos esse retorno porque configuramos para que essa rota precise de um token para ser acessada.

Podemos ver esse trecho de código abaixo:

routes() {

    this.app.route("/").get((req, res) => {
      res.send({ 'result': 'version 0.0.2' })
    });

    this.app.use(Auth.validate);

    this.app.route("/api/v1/users").get(UserRoute.getAll);

  }

Notem que estamos adicionando o middler de validate na linha 7.

Testando DB

Para testar o banco de dados, basta você configurar a sua string de conexão no arquivo config/db.ts. Caso tudo esteja OK, ele irá retornar o status de conectado conforme podemos ver na imagem abaixo:

MondoDB connected

Bom, com isso nós passamos por toda estrutura gerada pelo pacote ts-api. Espero que esse projeto possa ajudar.