API RESTful Node utilizando Typescript, Restify, MongoDB e Yup

Sandy Tauber
3 min readNov 4, 2020

--

Hoje vamos criar uma Api Restful em Node que vai ser escrita em Typescript (depois vamos ver como fazer o build para transformar o código para javascript), utilizando o framework Web Restful Restify (o mesmo utilizado pela Netflix, Napster, Pinterest, Joyent e npm), o banco de dados MongoDB, o validador de dados YUP, JWT como Token de autorização e bcryptjs para criptografia.
Será uma Api básica, com exemplo de rotas GET, POST, PUT e DELETE, onde duas rotas serão para registro e login de um usuário que poderá fazer o uso das outras rotas.

Antes de começar

Será preciso 3 passos antes de por a mão na massa:
1º) Verifique se você já tem o Node instalado em sua máquina, para isso abra o terminal/cmd e digite:

node -v

2°) Verifique se o npm também esta instalado (ele vem junto com o Node, mas é bom verificar por garantia 🤗), para isso abra o terminal/cmd e digite:

npm -v

3°) Acesse https://account.mongodb.com/account/register e crie sua conta para ter acesso ao MongoDB sem precisar instala-lo na sua máquina ou faça a instalação dele na sua máquina (Eu prefiro usar o da Atlas, é bem mais prático que instalar 😁)

Preparando o terreno

Crie uma pasta e abra ela em sua IDE de preferência (VS Code, Atom, Sublime, Noteped, Vim.. tanto faz, da tudo o mesmo resultado [só vai sofrer mais em uns do que em outros])
Vamos iniciar o projeto Node com o seguinte comando

npm init -y

Ele vai gerar um package.json com infos básicas do nosso projeto (-y é pra aceite automático)

Agora vamos instalar todas as dependências do projeto

npm i typescript restify mongoose yup bcryptjs jsonwebtoken -P

Vamos la…
npm i é a abreviação de npm install
typescript e restify são meio óbvios…
mongoose é um ODM (Object Data Modeling) do Node desenvolvido para conectar-se ao MongoDB
yup
é o validador de dados
bcryptjs é uma lib de criptografia do tipo hash
jsonwebtoken é uma lib de autenticação remota entre duas partes
-P é para salvar tudo isso no package.json como dependência

Agora vamos as dependências de desenvolvimento (elas servem unicamente para nos auxiliar no desenvolvimento, não indo para produção)

npm i @types/typescript @types/restify @types/mongoose @types/yup @types/bcryptjs @types/jsonwebtoken -D

Aqui são os tipos (eles contém as definições de tipos de cada lib) de tudo que instalamos antes. O -D é para salvar no package.json como dependência de desenvolvimento

Estrutura de pastas
Optei por deixar todos os arquivos na raiz, pois quando o assunto é estrutura de pasta de Api Rest cada um tem uma opinião/preferência diferente, então cada arquivo tem no nome o que ele é. Exemplo: users.controllers.ts esse é um arquivo controller do usuário e assim por diante, só pra tentar deixar o mais claro possível.
Abaixo segue a estrutura de pastas que gosto de usar:

api-rest-structure
└───src

└───config
│ │ connect.db.ts
│ │ environment.ts
│ │ logger.ts

└───api

└───modules
│ │
│ └───users
│ │ users.ctrl.ts
│ │ users.view.ts
│ │ users.model.ts
│ │ users.routes.ts
│ │ users.service.ts
│ │ users.interface.ts
│ │ users.validation.ts
│ │ users.repository.ts

└───middlewares
│ token.ts

└───utils
│ responses.ts

└───server.ts

E lá vamos nós…

Abaixo segue os Gists do GitHub com os códigos separados por arquivos.
Achei melhor deixar comentários lá do que ficar colocando o código pedacinho por pedacinho e comentando…

Se você chegou até aqui: Parabéns!!! 🎉🎉🎉
Agora só mais dois comandos:

tsc index.ts --outDir dist 

Esse comando dará build no projeto e “transforma-rá” o typescript no javascript, os arquivos vão todos para a pasta /dist que será criada na raiz do projeto

node dist/index.js

Esse comando roda a nossa api, então se tudo der certo, você deve ver no terminal/cmd os logs do mongo conectado e do servidor rodando na porta estabelecida!
(Existem diversas maneiras de fazer o build e rodar uma aplicação typescript, mas para manter o mais simples optei por usar direto esses dois comandos, pois não requerem configurações extras, mas você pode usar babel, nodemon, etc.)

--

--