ExpressJS

Ao lidarmos com bancos de dados, conhecemos o TypeORM, uma biblioteca que trata da conexão com banco de dados (fazendo o mapeamento objeto relacional). Agora, para lidarmos com a API, vamos usar outra biblioteca: o ExpressJS, que cria um servidor web em nosso programa.

O primeiro passo, seguindo a própria documentação, envolve efetuar a sua instalação:

npm install express

Agora que o Express já está instalado, precisamos fazer um pequeno ajuste e incluir uma opção a mais no arquivo tsconfig.json, que ficará assim:

{
    "compilerOptions": {
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "esModuleInterop": true,
    }
}

A inclusão consiste na em "esModuleInterop": true. Essa configuração facilita a importação de módulos CommonJS, como o Express, usando a sintaxe de importação que já vínhamos adotando com ES Modules. Por padrão, o Express utiliza o mecanismo de módulos CommonJS, e a inclusão dessa linha permite trabalharmos com o Express seguindo o formato de importação que já vínhamos adotando.

# 👶🏾 Criando a primeira página web

A documentação do Express traz um exemplo bastante simples, que consiste em retornar uma mensagem de texto (”Hello World!”) quando tentarmos acessar a página web pelo browser:

import express from 'express';

const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

No fragmento de código acima, temos a importação do express, seguida pela definição de duas importantes variáveis:

  • app, que representa a nossa aplicação web;
  • port, que indica a porta em que a nossa aplicação web será executada;

Após a definição das variáveis, o código apresenta duas etapas importantes: a definição de rotas e o início do funcionamento do servidor.

Configuração da rota

Em uma aplicação back-end, como uma API, não temos menus. Sabemos qual operação deve ser executada (gravação ou leitura de um determinado dado) a partir das rotas, que são os caminhos envolvidos em uma URL.

No site ufmt.dev/poo, por exemplo, poo é uma rota que indica que um estudante aplicado deseja obter os conteúdos de “Programação Orientada a Objetos”, não de “Algoritmos e Estruturas de Dados II”. Se este fosse o caso, o estudante teria consultado a rota aed2: ufmt.dev/aed2.

Agora que possivelmente você já entendeu a ideia, vamos ao código:

app.get('/', (req, res) => {
  res.send('Hello World!')
})

Clique aqui para consultar os métodos HTTP.

Colocando o servidor para esperar as requisições

Diferente dos programas mais simples desenvolvidos anteriormente, que terminam a execução em segundos ou minutos, em um aplicação web não se sabe quando o usuário enviará as suas requisições. Por isso, é importante que esse servidor fique trabalhando constantemente.

O trabalho do servidor consiste, principalmente, em “ouvir” as requisições, como um atendente que espera a solicitação de um cliente:

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

No caso acima, estamos informando também em qual porta o servidor deve ouvir. Lembre-se do que já discutimos sobre portas em banco de dados: um mesmo hardware pode executar diferentes servidores (banco de dados, web, DNS, etc). Cada serviço ocupa uma porta específica.

Executando a aplicação

Para executar a aplicação, podemos simplesmente executar o comando: npx ts-node caminhoparaseuarquivo.ts como já fazíamos para os demais programas. Execute o código ( e, logo após, abra o navegador na seguinte URL: http://localhost:3000 para ver o seu programa em execução.

Agilizando o processo

Na abordagem anterior, precisaremos executar novamente o comando sempre que fizermos qualquer alteração no código do nosso programa. Para evitar esse processo, podemos aprimorar a solução e usar o Nodemon, que reinicia o servidor automaticamente sempre que alterarmos o arquivo:

Para isso, instale-o:

npm install -g nodemon

E execute o seu programa da seguinte forma:

nodemon caminhoparaseuarquivo.ts