Introdução ao Express
Tags: node, beginners, webdev, braziliandevs
Published: 2022-03-16 21:34:02

## Tabela de Conteúdos

- [HTTP](#http)
- [APIs](#apis)
- [Express](#express)
- [API com Express](#api-com-express)
- [Curiosidade: API sem o Express](#curiosidade-api-sem-o-express)
- [Nodemon](#nodemon)
- [Links Úteis](#links-úteis)

## HTTP

### O que é?

É o protocolo mais utilizado na web para a comunicação entre cliente e servidor.

### O que faz?

Carrega informações `cliente -> servidor / servidor -> cliente`, sendo possível alterar o modo de envio através dos métodos HTTP, onde cada método possui seu significado semântico e _diz_ para o servidor realizar uma ação diferente.

### Principais métodos

Existem ao todo 39 métodos diferentes, porém os 5 principais são:

- __`GET`__: Requisita uma informação ao servidor
- __`POST`__: Cria uma nova informação no DB
- __`PUT`__: Atualiza completamente uma informação no DB
- __`DELETE`__: Deleta uma informação no DB
- __`PATCH`__: Atualiza parcialmente uma informação no DB

### Maiores detalhes

Para mais detalhes recomendo a leitura da [documentação da MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods).

E recomendo os seguintes sites para consulta de status HTTP:
- [HTTP Status MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)
- [HTTP Status Dogs](https://httpstatusdogs.com) ou [HTTP Dogs](https://http.dog) _Para quem gosta de cachorros_.
- [HTTP Cats](https://http.cat) _Para quem gosta de gatos_

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## APIs

### O que são?

São quaisquer aplicações que permitam a comunicação programática entre diferentes serviços. Enfatizando que, APIs não se restringem apenas a Web, existem APIs para comunicação com Desktop, Mobile e SO _(Sistema Operacional)_.

### O que fazem?

Permite a pessoa desenvolvedora construir soluções integradas utilizando determinadas APIs como peças intermediárias, dessa forma não é necessário por exemplo, programar a parte de manipulação de arquivos no SO, pois o Node.js já possui tal API integrada.

### API + HTTP

A maior parte das APIs da Web são APIs HTTP, ou seja, aplicações que se comunicam através de protocolos HTTP. Normalmente essas aplicações adotam a versão 1.1 do protocolo, pois nessa versão tem-se uma preocupação maior em relação à semântica dos métodos.

Porém não é obrigatório que todas as API sigam esse modelo, APIs não relacionadas a Web, como fetch API e File System API, que são integradas ao Node.js por exemplo, não utilizam o protocolo HTTP.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Express

### O  que é?
É um framework criado para __facilitar a criação de APIs HTTP__, ele foi construído pensando no padrão REST, porém o Express não impõe nenhum padrão de desenvolvimento.

### O que faz?
O Express fornece diversos recursos e abstrações úteis na hora de desenvolver uma API HTTP, facilitando o trabalho de desenvolvimento.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## API com Express

### Como fazer?
Para a criação de uma API utilizando o Express precisamos apenas de três coisas, primeiro precisamos estar trabalhando dentro de um módulo Node, segundo precisamos ter o Express instalado e por fim iremos utilizar alguns métodos do framework para a criação da aplicação.

### Comandos
Dentro de uma pasta precisamos inicializar um módulo Node, após isso instalamos o Express e por fim criamos o arquivo que irá conter a API. Respectivamente os comandos são:

``` 
npm init -y
npm i express
touch index.js
```

### Estrutura básica
Dentro de nosso arquivo JS podemos utilizar a seguinte estrutura para criar uma API simples.

``` javascript
// index.js

const express = require('express');
  const api = express();

  api.get('/', (_req, res) => {
   res.status(200).send('Hello World');
  });

  api.listen(3001, () => {
   console.log('Server is running on port 3001');
  });
```

E para executar nossa primeira API utilizamos o comando:

``` bash
node index.js
```

Podemos substituir o `index.js` pelo nome do arquivo que contém o código acima, porém o mais comum é esse arquivo se chamar `index.js` ou `server.js`.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Curiosidade: API sem o Express
Apenas para ilustrar o quanto o Express facilita a vida, vou demonstrar a mesma API vista acima utilizando apenas recursos nativos do Node.js.

``` javascript
const http = require("http");
const url = require("url");

http.createServer((req, res) => {
  const path = req.url;

  if (path === '/') {
    res.writeHead(200, {"Content-Type": "text/html;charset-utf-8"});
    res.end('Hello World');
  }
}).listen(3001, (err) => {
  if (err) {
      console.log(err);
  } else {
      console.log("Server is running on port 3001");
  }
})

```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Nodemon

### O que é?
É um pacote que nos disponibiliza o _hot-reload_ do servidor, ou seja, o servidor irá reiniciar automaticamente sempre que sofrer uma alteração, de forma similar ao que ocorre no React.

Lembrando que caso não utilizemos esse pacote, será necessário reiniciar a aplicação manualmente toda a vez que modificamos algo.

### Instalação
Por ser um pacote focado no _hot-reload_, seu uso deve ser feito exclusivamente em ambiente de desenvolvimento, assim como sua instalação. Afinal não iremos precisar de tal funcionalidade no ambiente de produção.

``` bash
npm i -D nodemon
```

### Utilização
Para utilizarmos esse pacote é muito simples, tudo o que precisamos fazer é criar um novo script no `package.json`, esse que pode ser nomeado da forma que preferirmos, porém uma recomendação é nomear como `"dev"`.

Esse script irá conter o comando `nodemon` e o _path_ até seu arquivo de entrada da aplicação, normalmente irá estar na raiz do projeto, ou dentro do diretório `src/`.

``` json
"scripts": {
  "dev": "nodemon index.js"
},
```

Com o script definido, tudo que nos resta fazer é executá-lo, para isso chamamos o comando:

``` bash
npm run dev
npm run #nome do script
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

---

## Links Úteis

- [Detalhes das Rotas do Express](https://dev.to/gabrielhsilvestre/o-basico-express-rotas-4i70)
- [Nodemon docs](https://github.com/remy/nodemon#nodemon)
- [Express docs](http://expressjs.com/en/4x/api.html)
- [Express docs - Rotas](https://expressjs.com/pt-br/guide/routing.html)
- [Express docs - Middleware](https://expressjs.com/pt-br/guide/writing-middleware.html)
- [DevHints - Express Cheat Sheet](https://devhints.io/express)
- [HTTP Status MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)
- [HTTP Status Dogs](https://httpstatusdogs.com)
- [HTTP Dogs](https://http.dog)
- [HTTP Cats](https://http.cat)

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>