Criar uma nova aplicação Web de arquitetura Express

Concluído

As empresas geralmente armazenam uma grande quantidade de dados em sistemas de arquivos e bancos de dados. Eles acessam esses dados servindo-os por meio de aplicativos da Web a partir de APIs usando HTTP.

Servidores Web e aplicações Web

Um servidor web é um software que responde a solicitações de clientes. Uma aplicação Web fica na parte superior do servidor Web. Alguns ambientes, como o Node.js, fornecem o servidor Web e a aplicação Web em uma estrutura. Neste módulo, o servidor web é fornecido pelo HTTP módulo. A aplicação Web é fornecida pela estrutura Express.js e inclui o servidor Web.

Saiba mais:

  • Aplicativos Web: O aplicativo entrega um aplicativo Web ao cliente:
    • Visualmente com HTML, CSS e JavaScript
    • Dados com APIs
    • Visual e dados com uma combinação de HTML, CSS, JavaScript e APIs. Esta é considerada uma aplicação monolítica.
  • Roteamento de URL: o roteamento de URL é um mecanismo para fornecer funcionalidade do servidor Web quando um endereço de URL específico é solicitado. Por exemplo, a URL /products pode estar associada a uma função que retorna uma lista de produtos. A URL /products/1 pode estar associada a uma função que retorna um produto específico.
  • Cabeçalhos HTTP: São pares chave-valor que são enviados do cliente para o servidor. Eles contêm informações sobre a solicitação ou resposta.
    • Suporte para diferentes tipos de conteúdo: um cliente pode solicitar dados em um formato específico e pode retornar nesse formato, como texto sem formatação, JSON, HTML ou CSV.
    • Autenticação/autorização: alguns dados podem ser confidenciais. É possível que um utilizador precise de iniciar sessão ou ter uma função ou nível de permissão específico para aceder aos dados. Isso é tratado no cabeçalho HTTP.
  • Intercâmbio de dados: os utilizadores poderão ter de visualizar e adicionar dados ao sistema. Para adicionar dados, os usuários podem inserir dados em um formulário ou carregar arquivos.
  • Time to market: Para criar aplicações web e APIs de forma eficiente, escolha ferramentas e estruturas que forneçam soluções para problemas comuns. Essas opções ajudam o desenvolvedor a atender rapidamente aos requisitos de negócios do trabalho.

Módulo HTTP no Node.js

O Node.js inclui um módulo HTTP incorporado. É um módulo relativamente pequeno que processa a maioria dos tipos de pedido. Ele suporta tipos comuns de dados, como cabeçalhos, URL e dados.

O exemplo de código a seguir é um servidor Web simples que escuta solicitações de entrada na porta 3000. Ele responde com uma mensagem hello world de texto simples para o cliente, independentemente da rota de URL ou cabeçalhos HTTP usados.

// Include the HTTP module
const http = require('http');

// Set the port to 3000
const PORT = 3000;

// 1. Process incoming requests (req), reply with response (res)
const requestHandler = (req, res) => {

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('hello world');
}

// 2. Create a server with the requestHandler
const server = http.createServer(requestHandler);

// 3. Start listening for incoming requests on port
server.listen(PORT, () => {
  console.log(`listening on port ${PORT}`)
})

Este exemplo configura o aplicativo Web com as seguintes etapas:

  1. requestHandler: A função lê a solicitação () e determina qual resposta (reqres) enviar.
  2. server: O createServer() método é definido com o manipulador de solicitação. Como há apenas um manipulador de solicitação, o servidor sempre responderá com a mesma resposta. Em um aplicativo do mundo real, você teria vários manipuladores de solicitação para lidar com diferentes tipos de solicitações e rotas diferentes. Esta questão será abordada mais pormenorizadamente mais adiante.
  3. server.listen: O listen() método é invocado com uma porta especificada. Após a chamada para o método, o servidor está pronto para aceitar solicitações de listen() cliente. Quando executado localmente, o aplicativo estará disponível em http://localhost:3000. A console.log instrução é executada para informar ao desenvolvedor que o servidor está pronto para uso.

Este exemplo de código Express.js usa vários estilos de funções:

  • retorno de chamada em server.listen(PORT string, callback_function)
  • função de seta na requestHandler = (req, res) => {} qual tem regras de escopo diferentes de uma função regular

Express.js quadro

Até aqui, ficou a saber mais sobre as capacidades do módulo HTTP no Node.js. É uma escolha perfeitamente válida para aplicações Web mais pequenas. Se uma aplicação se tornar grande, uma arquitetura como o Express poderá ajudar a criar a arquitetura de forma dimensionável.

Depois de criar alguns aplicativos Web, você notará que resolve os mesmos problemas repetidamente. São habituais os problemas de gestão de rotas, a autenticação e a autorização e a gestão de erros. Neste ponto, você começa a procurar uma estrutura como o Express que resolva alguns ou todos esses problemas.

Gestão de rotas no Express

Quando um cliente faz uma solicitação para um aplicativo Web, ele usa uma URL, que é um endereço que aponta para um servidor específico. Um URL poderá ter este aspeto:

http://localhost:3000/products

O termo localhost no URL refere-se à sua própria máquina. Um URL mais voltado para a produção pode ter trocado o termo localhost por um nome de domínio como microsoft.com. A parte final do URL é a rota. Ele decide um lugar lógico específico para ir no servidor. Neste caso, a rota é /products.

A arquitetura Express utiliza o URL, a rota e os verbos de HTTP para a gestão das rotas. Verbos HTTP como post, pute get descrevem a ação desejada pelo cliente. Cada verbo HTTP tem um significado específico para o que deve acontecer aos dados. O Express ajuda a registar rotas e a emparelhá-las com os verbos HTTP adequados para organizar a aplicação Web. O Express tem métodos dedicados ao processamento de diferentes verbos HTTP e tem um sistema inteligente para associar diferentes rotas a diferentes blocos do código.

No exemplo a seguir, o Express ajuda você a lidar com solicitações direcionadas a uma rota com o endereço /products associado ao verbo getHTTP :

app.get('/products', (req, res) => {
  // handle the request
})

Express vê app.get for /products como diferente de for /products, conforme mostrado neste próximo exemplo de app.post código:

app.get('/products', (req, res) => {
  // handle the request
})

app.post('/products', (req, res) => {
  // handle the request
})

O verbo get HTTP significa que um usuário deseja ler dados. O verbo post HTTP significa que eles querem escrever dados. É comum dividir seu aplicativo para que diferentes emparelhamentos de rotas e verbos executem diferentes partes de código. Este conceito será abordado mais detalhadamente mais adiante.

Servir diferentes tipos de conteúdo

O Express suporta muitos formatos de conteúdo que podem ser devolvidos para um cliente de chamada. O res objeto vem com um conjunto de funções auxiliares para retornar diferentes tipos de dados. Para devolver texto simples, teria de utilizar o método send() da seguinte forma:

res.send('plain text')

Para outros tipos de dados, como JSON, existem métodos dedicados que garantem que o tipo de conteúdo correto e as conversões de dados sejam feitas. Para retornar JSON no Express, use o json() método, da seguinte forma:

res.json({ id: 1, name: "Catcher in the Rye" })

O método de código Express anterior é equivalente a este código de módulo HTTP:

res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ id: 1, name: "Catcher in the Rye" }))

O Content-Type cabeçalho em HTTP é definido e a resposta também é convertida de um objeto JavaScript para uma cadeia de caracteres antes de ser retornada ao cliente chamador.

Se compararmos os dois exemplos de código, poderá ver que o Express guarda algumas linhas de escrita, ao utilizar métodos auxiliares para tipos de ficheiros comuns, como JSON e HTML.

Criar uma aplicação Express

Para começar a programar uma aplicação Node.js com a arquitetura Express, precisa de a instalar como uma dependência. Também é recomendado que inicialize primeiro um projeto Node.js, para que todas as dependências transferidas sejam incluídas no ficheiro package.json. É uma recomendação geral para todas as aplicações programadas para o runtime Node.js. As vantagens desta ação surgem ao emitir o código para um repositório como o GitHub. Qualquer pessoa a obter o código do GitHub pode facilmente utilizar o código que escreveu ao instalar as respetivas dependências.

Para criar um aplicativo Web com a estrutura Express, as etapas típicas incluem:

  1. Criar o aplicativo Web: crie uma instância do aplicativo Web. Neste ponto, o servidor web não pode ser executado, mas você tem algo que pode estender.
  2. Definir rotas e manipuladores de rotas: defina quais rotas o aplicativo deve ouvir. A gestão de rotas típica inclui:
    • rota raiz: '/'
    • Rotas de recursos: '/Products'
    • Rota geral: '*'
  3. Configurar middleware: Middleware é uma parte do código que pode ser executado antes ou depois de uma solicitação. Os exemplos incluem autenticação, validação de dados e registro.
  4. Iniciar o aplicativo: defina uma porta e instrua o aplicativo a ouvir essa porta. Agora, a aplicação está pronta para receber pedidos.