Olá Habr! Apresento a você a tradução do artigo
“Criando uma API REST: Fundamentos do Servidor Web” .
Parte 1. Criando uma API REST: Fundamentos do Servidor Web
O servidor da web é um dos componentes mais importantes da API REST. Nesta postagem, você começará seu projeto da API REST criando alguns diretórios e arquivos iniciais. Em seguida, você criará um módulo de servidor da web e o conectará para que o servidor seja iniciado e desligado corretamente.
O código neste projeto será organizado usando uma estrutura de diretórios comum, que pode ser ajustada e criada ao longo do tempo, conforme necessário.
cd ~ mkdir hr_app cd hr_app/ touch index.js mkdir config touch config/web-server.js mkdir controllers mkdir db_apis mkdir services touch services/web-server.js
O arquivo index.js pode ser considerado como o arquivo "principal" no aplicativo. Será o ponto de entrada para o aplicativo. Adicionaremos código a este arquivo e aos arquivos web-server.js nos diretórios de configuração e serviços.
Cole o seguinte código no arquivo
Home> hr_app> config> web-server.js module.exports = { port: process.env.HTTP_PORT || 3000 };
No Node.js, um objeto de processo possui uma propriedade env que contém um ambiente de usuário. Eu uso isso para definir o valor da porta como o valor da variável de ambiente HTTP_PORT. Se essa variável de ambiente não estiver definida, o valor padrão é 3000.
Cole o seguinte código no
arquivo Home> hr_app> services> web-server.js const http = require('http'); const express = require('express'); const webServerConfig = require('../config/web-server.js'); let httpServer; function initialize() { return new Promise((resolve, reject) => { const app = express(); httpServer = http.createServer(app); app.get('/', (req, res) => { res.end('Hello World!'); }); httpServer.listen(webServerConfig.port) .on('listening', () => { console.log(`Web server listening on localhost:${webServerConfig.port}`); resolve(); }) .on('error', err => { reject(err); }); }); } module.exports.initialize = initialize;
Linhas 1-3: Vários módulos necessários. O módulo http está incluído no Node.js, mas o módulo Express precisará ser instalado via npm.
Linhas 7-27: Uma função denominada initialize é declarada. A função retorna imediatamente uma promessa, que é permitida ou rejeitada, dependendo de o servidor da Web ser iniciado com êxito.
Linhas 9-10: Um novo aplicativo expresso é criado (que na verdade é apenas uma função) e, em seguida, usado para criar um servidor http através do módulo http.
Linhas 12-14: O método get do aplicativo é usado para adicionar um manipulador para solicitações GET que chegam ao caminho raiz (/). A função de retorno de chamada será chamada após o recebimento de uma solicitação e usará o parâmetro "res" (res) para enviar a resposta "Olá, mundo!" Para o cliente.
Linhas 16-24: O método de escuta do servidor é usado para ligar à porta especificada e começar a escutar solicitações recebidas.
Linha 28: exportando o módulo para que possa ser usado externamente
Cole o seguinte código no arquivo
Home> hr_app> index.js const webServer = require('./services/web-server.js'); async function startup() { console.log('Starting application'); try { console.log('Initializing web server module'); await webServer.initialize(); } catch (err) { console.error(err); process.exit(1);
Conectamos o módulo do servidor da web e, em seguida, ele determina e chama a função de inicialização assíncrona. Como a função de inicialização do servidor da Web retorna uma promessa, você pode usá-lo com async / waitit e envolvê-lo em um bloco try-catch. Se a função de inicialização for bem-sucedida, o servidor da web funcionará; caso contrário, quaisquer exceções serão capturadas e processadas. Tudo o que você precisa fazer agora é inicializar o npm e instalar o Express - então você pode iniciar o aplicativo. Execute os seguintes comandos em um terminal no diretório hr_app.
npm init -y npm install express -s node .
O comando npm init é usado para criar o arquivo package.json, que o npm usa como arquivo de manifesto (o sinalizador -y aceita opções padrão). O comando npm install é usado para instalar o express (o sinalizador -s inclui express na lista de dependências em package.json). O Npm armazena os módulos que você instala no diretório node_modules. Ele também cria um arquivo chamado package.lock.json para fornecer uma árvore idêntica para a equipe de desenvolvimento.
Você vê a mensagem
Servidor da Web escutando no localhost: 3000? Parabéns, você criou um servidor expresso com base em!
E aqui está ele, outro "Olá Mundo". Embora não seja particularmente divertido, este é um primeiro passo importante para sua API.
Quando estiver pronto, você pode desligar o servidor retornando ao terminal e pressionando ctrl + c.

Desligamento controlado
Durante o desligamento pressionando Ctrl + C, você não tem controle sobre como isso aconteceu. Para controlar o processo de desligamento, é necessário fechar explicitamente o servidor da web e sair do processo Node.js.
Cole o seguinte código no
arquivo Home> hr_app> services> web-server.js
A função fechar retorna uma promessa que é resolvida quando o servidor da web é fechado com êxito. O método httpServer.close interrompe o estabelecimento de novas conexões, mas não força a fechar as conexões já abertas. Dependendo de quantas conexões estão abertas e do que estão fazendo, pode ser necessário aguardar um pouco até que o retorno de chamada funcione. Embora você não faça isso neste módulo, é possível usar módulos personalizados de código ou npm, como http-shutdown para forçar o fechamento de conexões abertas.
Cole o seguinte código no arquivo
Home> hr_app> index.js
Os eventos SIGINT e SIGTERM estão relacionados a sinais que podem ser enviados para um processo para desligá-lo, por exemplo, quando ctrl + c é pressionado. Um evento uncaughtException ocorrerá quando um erro JavaScript for lançado, mas não capturado, e tratado usando a instrução try-catch. Tente iniciar e fechar o aplicativo novamente. Você descobrirá que tudo funciona corretamente quando você vê mensagens de "desligamento" no terminal.
Registro no servidor
Há mais uma coisa que completa nosso módulo de servidor da Web: log HTTP. Existem vários módulos que você pode usar para esse tipo de login, mas o morgan é um dos mais simples. Vamos instalar o Morgan usando o npm.
npm install morgan -s
Em seguida, adicione a seguinte linha ao services / web-server.js sob a linha que requer express (linha 2):
const morgan = require('morgan');
Agora você pode ativar a função morgan como middleware, através da qual todas as solicitações serão processadas usando app.use. Adicione esta linha antes de chamar app.get, que exibe a mensagem "olá mundo".
Observe que app.use cria um pipeline de funções de middleware que podem interagir com solicitações e respostas HTTP. As funções do middleware serão executadas na ordem em que estão ativadas. Reinicie o aplicativo e instale o terminal para que você possa vê-lo e o navegador ao mesmo tempo. Cada vez que você recarrega a página, você deve ver uma nova entrada de log no terminal. Por padrão, morgan passa as informações de registro para STDOUT (que é exibido no terminal).
O artigo a seguir abordará os conceitos básicos do trabalho com bancos de dados, incluindo pools de conexões, que ajudarão você a entender e criar a API REST para Node.js.