Criar um aplicativo Web com a estrutura Express
Frequentemente, as empresas armazenam um grande volume de dados em sistemas de arquivos e bancos de dados. Eles acessam esses dados fornecendo-os por meio de aplicativos Web a partir de APIs via HTTP.
Servidores Web e aplicativos Web
Um servidor Web é um software que responde a solicitações de clientes. Um aplicativo Web fica na parte superior do servidor Web. Alguns ambientes, como o Node.js, disponibilizam o servidor Web e o aplicativo Web em uma estrutura. Neste módulo, o servidor Web é fornecido pelo módulo HTTP
. O aplicativo Web é fornecido pela estrutura do Express.js e inclui o servidor Web.
Saiba mais:
- Aplicativos Web: O aplicativo fornece um aplicativo Web para o cliente:
- Visualmente com HTML, CSS e JavaScript
- Dados por meio de APIs
- Visual e dados com uma combinação de HTML, CSS, JavaScript e APIs. Isso é considerado um aplicativo monolítico.
- 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: Estes 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. Um usuário pode precisar entrar ou pode precisar de uma função ou nível de permissão específico para acessar os dados. Isso é tratado no cabeçalho HTTP.
- Troca de dados: Talvez os usuários precisem exibir e adicionar dados ao sistema. Para adicionar dados, os usuários poderão inseri-los em um formulário ou carregar arquivos.
- Tempo para comercialização: Para criar aplicativos Web e APIs de maneira eficiente, escolha ferramentas e estruturas que fornecem 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 é fornecido com um módulo HTTP interno. Trata-se de um módulo razoavelmente pequeno que processa a maioria dos tipos de solicitações. Isso dá suporte a 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 3.000. Ele responde com uma mensagem de texto hello world
simples para o cliente, independentemente da rota de URL ou dos 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}`)
})
Esse exemplo configura o aplicativo Web com as seguintes etapas:
- requestHandler: A função faz a leitura da solicitação (
req
) e determina qual resposta (res
) enviar. - servidor: O método
createServer()
é 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 atender a diferentes tipos de solicitações e rotas. Isso será abordado em mais detalhes posteriormente. - server.listen: O método
listen()
é invocado por uma porta especificada. Após a chamada ao métodolisten()
, o servidor fica pronto para aceitar as solicitações do cliente. Quando executado localmente, o aplicativo estará disponível emhttp://localhost:3000
. A instruçãoconsole.log
é 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 em
requestHandler = (req, res) => {}
, a qual tem regras de escopo diferentes de uma função regular
Estrutura do Express.js
Até agora, você aprendeu sobre as funcionalidades do módulo HTTP no Node.js. Trata-se de uma opção perfeitamente válida para aplicativos Web menores. Se um aplicativo ficar grande, uma estrutura como o Express poderá ajudar você a criar sua arquitetura de maneira escalonável.
Após criar alguns aplicativos Web, observe que você solucionará os mesmos problemas várias vezes. Problemas como gerenciamento de rotas, autenticação e autorização e gerenciamento de erros são comuns. Nesse ponto, você começa a procurar uma estrutura como o Expresso que resolva alguns desses problemas ou todos eles.
Gerenciamento de rotas no Express
Quando um cliente envia uma solicitação a um aplicativo Web, ele usa uma URL, ou seja, um endereço que indica um servidor específico. Uma URL pode ser parecida com o seguinte:
http://localhost:3000/products
O termo localhost
na URL se refere ao seu computador. Uma URL com aparência de produção talvez tenha substituído o termo localhost
por um nome de domínio, como microsoft.com
. A parte final da URL é a rota. Ela decide um local lógico específico para entrar no servidor. Nesse caso, a rota é /products
.
A estrutura Express usa a URL, a rota e os verbos HTTP para o gerenciamento de rota. Verbos HTTP como post
, put
e get
descrevem a ação desejada pelo cliente. Cada verbo HTTP tem um significado específico relacionado ao que deve acontecer aos dados. O Express ajuda a registrar rotas e a emparelhá-las com os verbos HTTP apropriados para organizar o aplicativo Web. O Express tem métodos dedicados para processar diferentes verbos HTTP, bem como um sistema inteligente para associar diferentes rotas a diferentes partes do código.
No seguinte exemplo, o Express ajuda a processar solicitações voltadas a uma rota com o endereço /products
associado ao verbo HTTP get
:
app.get('/products', (req, res) => {
// handle the request
})
O Expresso visualiza app.get
para /products
como diferente de app.post
para /products
, conforme mostrado neste próximo exemplo de código:
app.get('/products', (req, res) => {
// handle the request
})
app.post('/products', (req, res) => {
// handle the request
})
O verbo HTTP get
significa que um usuário deseja ler dados. O verbo HTTP post
significa que ele deseja gravar dados. É comum dividir o aplicativo de modo que diferentes emparelhamentos de rotas ou verbos executem partes distintas do código. Esse conceito será discutido em mais detalhes posteriormente.
Fornecer diferentes tipos de conteúdos
O Express dá suporte a muitos formatos de conteúdo diferentes que podem ser retornados para o cliente autor da chamada. O objeto res
é fornecido com um conjunto de funções auxiliares para retornar diferentes tipos de dados. Para retornar um texto sem formatação, você usará o método send()
da seguinte maneira:
res.send('plain text')
Para obter outros tipos de dados, como o JSON, há métodos dedicados que garantem a execução adequada de tipos de conteúdos e conversões de dados. Para retornar o JSON no Express, use o método json()
, desta forma:
res.json({ id: 1, name: "Catcher in the Rye" })
O método do código do Express anterior é equivalente a este código do módulo HTTP:
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ id: 1, name: "Catcher in the Rye" }))
O cabeçalho Content-Type
em HTTP é definido e a resposta também é convertida de um objeto do JavaScript em uma cadeia de caracteres antes de ser retornada ao cliente de chamada.
Comparando os dois exemplos de código, você pode ver que o Express economiza algumas linhas de digitação usando métodos auxiliares para tipos de arquivo comuns, como JSON e HTML.
Criar um aplicativo Express
Para começar a desenvolver um aplicativo Node.js usando a estrutura Express, você precisará instalá-lo como uma dependência. Também recomendamos que primeiro você inicialize um projeto Node.js para que todas as dependências baixadas terminem no arquivo package.json. Essa é uma recomendação geral para qualquer aplicativo desenvolvido para o runtime do Node.js. Os benefícios de fazer isso surgem ao efetuar push do código para um repositório como o GitHub. Qualquer pessoa que buscar o código no GitHub poderá usar com facilidade o código que você escrever instalando as dependências dele primeiro.
Para criar um aplicativo Web com a estrutura Expresso, as etapas típicas incluem:
- Criar o aplicativo Web: crie uma instância do aplicativo Web. Neste ponto, o servidor Web não é executável, mas você tem algo que pode estender.
- Definir rotas e manipuladores de rotas: defina quais rotas o aplicativo deve escutar. O gerenciamento de rotas típico inclui:
- rota raiz: '/'
- rotas de recurso: '/products'
- rota abrangente: '*'
- Configurar o middleware: O middleware é um trecho de código que pode ser executado antes ou depois de uma solicitação. Exemplos incluem autenticação, validação de dados e registro em log.
- Iniciar o aplicativo: defina uma porta e instrua o aplicativo a escutá-la. Agora, o aplicativo está pronto para receber solicitações.