Crie um servidor web HTTP em Node.js com Code Exemplo

โšก Resumo Inteligente

O Node.js cria um servidor web funcional em poucas linhas usando o mรณdulo http integrado. O servidor fica escutando em uma porta escolhida e responde a cada requisiรงรฃo com um cรณdigo de status e um corpo, enquanto um cรณdigo separado busca dados de outros sites.

  • ๐Ÿ–ฅ๏ธ Criaรงรฃo de servidor: O mรฉtodo `http.createServer` registra uma funรงรฃo de retorno de chamada que รฉ executada uma vez por solicitaรงรฃo recebida e recebe objetos de solicitaรงรฃo e resposta.
  • ๐Ÿ”ข Status e cabeรงalhos: O comando writeHead envia o cรณdigo de status e o Content-Type antes que qualquer conteรบdo do corpo da mensagem seja escrito.
  • ???? Vinculaรงรฃo de porta: O comando `server.listen` conecta o aplicativo a uma porta, e qualquer nรบmero de porta livre pode ser escolhido.
  • ๐Ÿ“ฅ Solicitaรงรตes de saรญda: Para obter dados de outro site, รฉ necessรกrio um cliente HTTP, e o Node agora inclui uma funรงรฃo fetch global.
  • โš ๏ธ Cliente obsoleto: O mรณdulo de requisiรงรฃo foi descontinuado em fevereiro de 2020 e nรฃo deve ser usado em novos cรณdigos.
  • ๐Ÿ› ๏ธ Fracassos de startups: Um erro EADDRINUSE significa que a porta escolhida jรก estรก sendo usada por outro processo.

Crie um servidor Web HTTP em Node.js

O Node.js O framework รฉ usado principalmente para criar aplicaรงรตes baseadas em servidor. Ele pode ser facilmente utilizado para construir servidores web que fornecem conteรบdo aos usuรกrios.

Vรกrios mรณdulos lidam com solicitaรงรตes relacionadas ao servidor, o mรณdulo integrado http O mรณdulo principal entre eles. Veremos como criar uma aplicaรงรฃo bรกsica de servidor web usando Node.js e, em seguida, como solicitar dados de outro site.

Nรณ como servidor web usando HTTP

Vejamos um exemplo de como criar e executar uma primeira aplicaรงรฃo Node.js.

O aplicativo cria um mรณdulo de servidor simples que escuta na porta 7000. Quando uma requisiรงรฃo รฉ feita atravรฉs do navegador nessa porta, o servidor envia um Olรก Mundo resposta ao cliente.

Nรณ como servidor web usando HTTP

Code Explicaรงรฃo

  1. O require A funรงรฃo lรช um JavaScript arquivo, executa-o e retorna seu objeto de exportaรงรตes. Aqui ele carrega o http mรณdulo para que sua funcionalidade esteja disponรญvel no aplicativo.
  2. Uma aplicaรงรฃo de servidor รฉ criada a partir de uma funรงรฃo simples. Essa funรงรฃo รฉ executada sempre que uma requisiรงรฃo chega ao servidor.
  3. Quando uma solicitaรงรฃo รฉ recebida, a resposta รฉ enviada com o status de 200Este รฉ o cรณdigo de status padrรฃo em um cabeรงalho HTTP para uma resposta bem-sucedida.
  4. O prรณprio corpo da resposta รฉ a string Olรก Mundo.
  5. server.listen Faz com que a aplicaรงรฃo fique ร  escuta de pedidos do cliente na porta 7000. Qualquer porta disponรญvel pode ser utilizada.

Se o comando for executado com sucesso, a seguinte saรญda aparecerรก no navegador.

saรญda

Saรญda do servidor web Node.js

A partir da saรญda:

  • Navegando atรฉ o localhost URL na porta 7000 exibe a string Olรก Mundo na pรกgina.
  • Como o cรณdigo especifica a porta 7000, a saรญda sรณ fica visรญvel ao acessar essa porta.

Segue o cรณdigo para referรชncia:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

Tratamento de solicitaรงรตes GET em Node.js

Fazer uma requisiรงรฃo GET para recuperar dados de outro site รฉ simples em Node.js. Historicamente, isso exigia... request Mรณdulo instalado a partir da linha de comando:

npm install request

Esse comando instrui o gerenciador de pacotes do Node a baixar e instalar o mรณdulo necessรกrio. Quando a instalaรงรฃo for concluรญda com sucesso, a linha de comando exibirรก o nome e a versรฃo do mรณdulo instalado no formato <name>@<version>.

saรญda da solicitaรงรฃo de instalaรงรฃo do npm

Na imagem acima, o request O mรณdulo e seu nรบmero de versรฃo foram baixados e instalados.

Como fazer uma requisiรงรฃo GET em Node.js

Code Explicaรงรฃo

  1. O request O mรณdulo instalado na etapa anterior fornece as funรงรตes necessรกrias para fazer solicitaรงรตes GET a sites.
  2. Uma requisiรงรฃo GET รฉ feita a um site, e uma funรงรฃo de retorno (callback) รฉ executada assim que uma resposta รฉ recebida. A funรงรฃo de retorno recebe trรชs parรขmetros:
    1. erro โ€” registra qualquer erro ocorrido durante a realizaรงรฃo da solicitaรงรฃo.
    2. Automatizadas โ€” carrega os cabeรงalhos HTTP retornados com a resposta.
    3. Corpo โ€” contรฉm todo o conteรบdo da resposta.
  3. O conteรบdo recebido no body O parรขmetro รฉ escrito no console.

Segue o cรณdigo para referรชncia:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

โš ๏ธ Aviso de descontinuaรงรฃo: da request mรณdulo era totalmente descontinuado em fevereiro de 2020. e nรฃo recebe mais atualizaรงรตes. Ele ainda instala e executa, entรฃo o exemplo acima continua vรกlido para projetos existentes, mas npm install request Agora imprime um aviso de obsolescรชncia. O novo cรณdigo deve usar a funรงรฃo integrada. fetch funรงรฃo mostrada na prรณxima seรงรฃo.

Como fazer requisiรงรตes HTTP com o fetch nativo no Node.js

O Node incluiu um global fetch funรงรฃo disponรญvel desde a versรฃo 18, compatรญvel com a API jรก fornecida pelos navegadores. Nรฃo requer instalaรงรฃo de pacotes e retorna uma promessa, funcionando diretamente com async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 โ€” check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

Trรชs diferenรงas em relaรงรฃo ao estilo de retorno de chamada merecem destaque. Primeiro, fetch rejeita apenas em caso de falha no nรญvel da rede; um erro HTTP 404 ou 500 ainda รฉ resolvido com sucesso, razรฃo pela qual o response.ok A verificaรงรฃo existe e explica por que omiti-la รฉ o erro mais comum ao migrar de requestEm segundo lugar, o corpo da mensagem nรฃo รฉ entregue com a resposta โ€” ele deve ser lido explicitamente com... response.text() para texto simples ou response.json() para JSON, e cada um deles retorna uma promessa prรณpria. Terceiro, como toda a chamada รฉ baseada em promessas, uma รบnica try/catch Abrange tanto a requisiรงรฃo quanto a leitura do corpo da mensagem, substituindo completamente o parรขmetro de retorno de chamada que prioriza erros.

Para scripts que precisam ser executados no Node 16 ou anterior, instale node-fetch or axios Em vez disso, jรก que ambos expรตem uma interface comparรกvel baseada em promessas e exigem apenas uma alteraรงรฃo na linha de importaรงรฃo apรณs a atualizaรงรฃo do ambiente de execuรงรฃo.

request vs fetch vs axios: qual usar?

Na maioria dos materiais sobre Node.js, trรชs clientes HTTP aparecem, mas apenas um deles รฉ uma opรงรฃo padrรฃo sensata para novos projetos. Eles diferem em relaรงรฃo ao status de manutenรงรฃo, ร  necessidade de dependรชncias e ร  forma como cada um sinaliza um erro. Portanto, a tabela abaixo os compara lado a lado.

Aspecto solicitar buscar (embutido) axios
Status Obsoleto desde 2020 Mantido no nรบcleo Mantido ativamente
Instalaรงรฃo pacote npm Nenhum no Node 18+ pacote npm
Sessรฃo de Fotos Callback de erro Promessa Promessa
Anรกlise JSON Manual ou opรงรฃo JSON Manual via response.json() Automรกtico
Rejeiรงรตes com base nos cรณdigos 404 ou 500 Nรฃo Nรฃo Sim

Uso fetch Para novos projetos em uma versรฃo atual do Node, pois nรฃo adiciona dependรชncias e รฉ compatรญvel com a API do navegador que os desenvolvedores jรก conhecem. Escolha axios Quando o tratamento automรกtico de JSON, interceptadores de requisiรงรฃo ou rejeiรงรฃo em casos de erro economizariam cรณdigo real. Mantenha. request Somente em aplicaรงรตes legadas que jรก dependem dele e planejam substituรญ-lo.

Erros comuns do servidor Node.js e como corrigi-los

A maioria das falhas ao iniciar um servidor Node pela primeira vez decorre de portas, caminhos ou falta de resposta, e nรฃo do prรณprio cรณdigo do servidor.

  • USO DE รGUA: Outro processo jรก estรก utilizando a porta. Execute. netstat -ano | findstr :7000 on Windows, ou lsof -i :7000 on macOS e no Linux, em seguida, interrompa esse processo ou escolha uma porta diferente.
  • EACCES em uma porta baixa: Portas abaixo de 1024 exigem privilรฉgios elevados. Utilize uma porta acima de 1024 durante o desenvolvimento, como 3000 ou 7000.
  • O navegador trava e nรฃo carrega. O atendente nunca ligou. response.end()A conexรฃo permanece aberta atรฉ que o tempo limite seja atingido, portanto, cada caminho atravรฉs do manipulador deve finalizar a resposta.
  • Nรฃo foi possรญvel encontrar o mรณdulo 'http': O nome do arquivo estava escrito incorretamente ou o script estรก sendo executado em um navegador em vez do Node.js. Os mรณdulos principais nรฃo precisam de instalaรงรฃo.
  • As alteraรงรตes nรฃo aparecem: O Node carrega o arquivo uma รบnica vez na inicializaรงรฃo. Reinicie o processo apรณs cada ediรงรฃo ou execute-o sob um observador, como por exemplo... node --watch server.js.

Perguntas Frequentes

O mรณdulo http รฉ suficiente para um รบnico endpoint. O Express adiciona roteamento, middleware e anรกlise de corpo da requisiรงรฃo, o que justifica a dependรชncia quando uma aplicaรงรฃo serve vรกrias rotas.

Exigir o https Em vez disso, use o mรณdulo e passe uma chave e um certificado para criar o servidor. Em produรงรฃo, um proxy reverso como o Nginx normalmente encerra o TLS e encaminha o HTTP sem criptografia para o Node.

Sim. Travas deslizantes portรกteis AI As ferramentas convertem callbacks que retornam erros em async/await de forma confiรกvel. Verifique se o cรณdigo gerado adiciona um teste `response.ok`, pois o `fetch` resolve em caso de erro 404 e essa verificaรงรฃo costuma ser omitida.

Os assistentes de IA leem o cรณdigo de erro e identificam a causa diretamente, distinguindo um conflito de porta de um problema de permissรฃo ou uma falha de sintaxe, o que reduz consideravelmente as tentativas e erros em um primeiro projeto Node.

O objeto de requisiรงรฃo รฉ um fluxo, portanto, colete seus eventos de dados em um buffer e analise o resultado no evento final. O Express e frameworks similares fornecem middleware de anรกlise de corpo que executa essa etapa para vocรช.

Resuma esta postagem com: