JavaScript Básico 17 – Projeto Calculadora (Parte 3)

Neste artigo, serão disponibilizados e explicados os códigos utilizados na parte três do nosso projeto de calculadora. Caso ainda não tenha visto as partes 1 e 2 do projeto da Calculadora, acesse e obtenha o HTML e CSS necessários para a criação do layout desta calculadora: JavaScript Básico 15 – Projeto Calculadora (Parte 1), JavaScript Básico 16 – Projeto Calculadora (Parte 2)

Dentro do nosso projeto, podemos começar criando uma função de soma, que irá receber dois valores como parâmetros e irá somá-los:

// Função que soma dois valores
function somarValores(valor1, valor2){
    return valor1 + valor2;
}

Após isso, criaremos uma função de subtração, que irá subtrair o segundo valor do primeiro valor:

// Função que subtrai o segundo valor do primeiro
function subtrairValores(valor1, valor2){
    return valor1 - valor2;
}

Criadas essas duas funções, podemos criar também uma função para multiplicar valores:

// Função que multiplica dois valores
function multiplcarValores(valor1, valor2){
    return valor1 * valor2;
}

Para criar a função de divisão, devemos:

  • Criar uma estrutura condicional;
  • Se o segundo valor for zero, retornar uma mensagem de erro.
// Função que divide o primeiro valor pelo segundo
function dividirValores(valor1, valor2){
    if(valor2 == 0){
        return "Erro, divisão por zero!";
    }else{
        return valor1 / valor2;
    }
}

 

Realizada a criação das funções, precisamos criar uma função específica para limpar os dados do input e os objetos de cálculo.

// Limpa todos os dados do input e objeto de calculo
function limparDados(){
    inputResultado.value = "";

    calculo.primeiroValor = 0;
    calculo.segundoValor = 0;
    calculo.funcaoParaCalcular = null;
}

Está gostando deste projeto? Deixe o seu comentário!
Bons estudos!

Calculadora (Parte 4)

JavaScript Básico 16 – Projeto Calculadora (Parte 2)

Neste artigo, serão disponibilizados e explicados os códigos utilizados na parte dois do nosso projeto de calculadora. Caso ainda não tenha visto a Parte 1 do projeto da Calculadora, acesse e obtenha o HTML e CSS necessários para a criação do layout desta calculadora: JavaScript Básico 15 – Projeto Calculadora (Parte 1)

Dentro de nosso projeto, precisamos criar uma variável para mostrar os elementos no nosso display.

// Criando uma variável para capturar o elemento
// do HTML pelo Id. Este elemento mostrará os valores no display.
let inputResultado = document.getElementById("inputDisplayResultado");

Após isso, criaremos um objeto com os dados e a função para calcular.

// Objeto para mantermos controle dos dados e funcão para calcular.
let calculo = {
    primeiroValor: 0,
    segundoValor: 0,
    funcaoParaCalular: null
}

Utilizando o window.addEventListener, ao carregar a janela, inicializaremos todos os métodos e variáveis criados:

// Ao carregar a janela, inicializa os métodos e variaveis
window.addEventListener("load", function () {
    atribuirEventos();
})

Agora, precisamos de uma função para a inserção de números na tela. Para isso:

  • Utilizaremos o inputResultado.value para exibir os valores preenchidos pelo usuário no display.
  • Se este valor não for um número, ele será substituído pelo próximo número clicado.
  • Se o valor for zero, também será substituído pelo próximo número clicado.
  • Se o valor for diferente de zero e for um número, a calculadora adicionará este número ao input, para que as operações sejam realizadas.
// Adiciona o número na tela
function inserirNumero() {
    // Se o valor na tela não for um número,
    // substitui pelo número/valor do botão
    if (isNaN(inputResultado.value)) {
        inputResultado.value = event.target.textContent;
        // Senão, adiciona o texto junto com o existente
    } else {
        // Se o valor na tela for zero, substitui o valor na tela pelo número clicado
        if (inputResultado.value == 0) {
            inputResultado.value = event.target.textContent;
        // Senão adiciona o número ao input para criar digitos maiores que 0
        } else {
            inputResultado.value += event.target.textContent;
        }
    }
}

Adicionaremos a função inserirNumero no evento de click de cada um dos botões de números da calculadora, para que, assim que clicados, o valor do respectivo botão apareça na tela do usuário.

//Atribui os eventos a todos os botões da calculadora
function atribuirEventos() {
    //Atribui eventos aos números
    document.getElementById("btnValor0").addEventListener("click", inserirNumero);
    document.getElementById("btnValor1").addEventListener("click", inserirNumero);
    document.getElementById("btnValor2").addEventListener("click", inserirNumero);
    document.getElementById("btnValor3").addEventListener("click", inserirNumero);
    document.getElementById("btnValor4").addEventListener("click", inserirNumero);
    document.getElementById("btnValor5").addEventListener("click", inserirNumero);
    document.getElementById("btnValor6").addEventListener("click", inserirNumero);
    document.getElementById("btnValor7").addEventListener("click", inserirNumero);
    document.getElementById("btnValor8").addEventListener("click", inserirNumero);
    document.getElementById("btnValor9").addEventListener("click", inserirNumero);
}

Está gostando deste projeto? Deixe o seu comentário!
Bons estudos!

Calculadora (Parte 3)

Node.js: importando dados de um arquivo .csv para o mongoDB

Quem nunca precisou abrir arquivo para importar o seus dados para uma base de dados? Esse é um processo simples que ajuda muito outras equipes como de RH, Financeiro … etc.

Hoje eu irei demonstrar como importar dados de um arquivo .csv com algumas das batalhas que ocorreram na serie GOT (Game of Thrones), utilizando o Node.js e uma base de dados mongoDB.

Para pular a etapa de criação de um novo projeto eu irei utilizar a versão final desse artigo. Caso tenha interesse em clonar esse projeto, segue o seu link no meu GitHub: node-csv-mongodb.

O projeto está bem simples, abaixo você tem uma breve explicação de cada um dos arquivos utilizados.

Analisando ela nós temos:

  • config/db: arquivo de conexão com a nossa base de dados
  • models/battles.js: model contendo os campos do arquivo .csv
  • repository/battleRepository: arquivo de mapeamento da model com a collection do banco de dados
  • battles.csv: arquivo contendo algumas das batalhas que ocorreram na série GOT
  • index.js: nós iremos explorar esse arquivo melhor, mas por hora ele é o responsável por abrir o arquivo .csv e importar os dados para o nosso banco de dados

Abra o projeto no seu editor de textos preferido, em seguida adicione a sua string de conexão no arquivo db.js. Com essa etapa OK, vamos analisar o arquivo index.js:

const db = require('./config/db');
const battleRepository = require('./repository/battleRepository');

const csv = require('csv-parser');
const fs = require('fs');

fs.createReadStream('./battles.csv')
    .pipe(csv())
    .on('data', (row) => {
        battleRepository.create(row);
    })
    .on('end', () => {
        console.log('CSV file successfully processed')
    });

Analisando esse trecho de código nós temos:

  • 01: estamos importando o arquivo db.js com a nossa conexão com o db
  • 02: estamos importando o nosso repository, ele será responsável pelas nossas queries.
  • 04 e 05: importando os pacotes (fs) e (csv-parser) para manipularmos o arquivo .csv
  • 07 até a 14: estamos passando o caminho do arquivo que iremos manipular -> abrindo ele -> passando os dados para o método .create do nosso repository para ele salvar os dados no db, assim que ele finalizar irá retornar a mensagem: ‘CSV file successfully processed’.

Para ficar mais clara essa etapa, comente a linha 11 do arquivo e adicione um console.log(row); no lugar, em seguida execute o comando node index.js. Abaixo você tem uma imagem demonstrando esse passo:

Note que ele passa por cada uma das linhas do arquivo e retorna cada uma deles na row. Agora descomente a linha 11 e execute o comando node index.js novamente.

Para verificar se os dados foram importados corretamente, eu irei utilizar o Robo 3T para conectar na minha base de dados. Abaixo você tem uma imagem demonstrando esse passo:

Note que todos os arquivos formam importados corretamente.

Bom, a ideia desse artigo era ser algo rápido para demonstrar como importar um arquivo .csv em um banco de dados mongoDB.

Espero que tenham gostado e até um próximo artigo pessoal.

Laço FOR em JavaScript

O laço FOR é uma estrutura de repetição muito utilizada em JavaScript. Este laço de repetição utiliza uma variável, que controlará a contagem do loop, podendo ser utilizada na forma de incremento ou decremento. É um comando que se faz muito útil quando se sabe de antemão quantas vezes a repetição será executada.

No JavaScript, o laço de repetição FOR poderá ser utilizado de quatro formas diferentes, sendo a mais usual:

PRIMEIRA FORMA (FOR)

Laço for com INCREMENTO:
// O laço de repetição for utiliza uma variável de varredura
// e irá retornar os valores do vetor, de forma crescente ou decrescente
let vetor=[11, 22, 33, 44];
for (let index = 0; index < vetor.length; index++) {
    console.log(vetor[index]);
}

Sendo nesta forma, normalmente serão passados como parâmetros uma variável auxiliar, que será utilizada para a varredura no laço, uma condição de saída/pause no laço e um incremento, que realizará uma varredura de forma crescente.

Laço for com DECREMENTO:
let vetor=[11, 22, 33, 44];
for (let index = 0; index < vetor.length; index--) {
    console.log(array[index]);
}

Nesta forma, o laço executará o loop de forma decrescente.


SEGUNDA FORMA (FOR…OF)

// O laço de repetição for...of percorre de forma iterativa e crescente
// e retorna os valores do vetor
let vetor=[11, 22, 33, 44];
for (const item of vetor) {
    console.log(item);
}

Nesta forma, chamada for…of, o laço percorre objetos de forma iterativa e crescente, chamando a função personalizada com instruções a serem executadas para o valor de cada objeto.


TERCEIRA FORMA (FOR…IN)

// O laço de repetição for...in percorre de forma iterativa e crescente
// e retornará quais são as posições em que os valores se encontram no vetor
let vetor=[11, 22, 33, 44];
for (const item in vetor) {
    console.log(item);
}

Na chamada for…in, o laço de repetição irá iterar sobre as propriedades do objeto de modo arbitrário. O loop irá iterar sobre todas as propriedades do próprio objeto, enumerando-as. Em suma, este laço enumerará quantas posições estão dispostas no vetor, retornando as suas posições.


QUARTA FORMA (FOREACH)

// O laço forEach usará de forma iterativa uma função
// para retornar os valores do vetor.
vetor.forEach(item => {
    console.log(item);
});

O laço forEach funciona de maneira semelhante ao laço forof, pois, de maneira iterativa e crescente, percorre os itens do laço e retorna os valores do vetor.

Como extrair um e-mail de uma String

Para extrair e-mails de uma string com JavaScript, ou qualquer outra linguagem, pode ser uma tarefa bem extensa devido a diversas conferencias que precisariam ser feitas para saber se aquele trecho é um e-mail

Por exemplo, você poderia ter algo do tipo:

let text = '@rediffmail.com blablabla farkal@gmail.com teste@@@ rodnsdfald ferdfnson <rfernsdfson@gmal.com> Affdmdol Gondfgale gyfanamosl@gmail.comtruform techno pidfpinfg@truformdftechnoproducts.com "NiTsdfeSh ThIdfsKaRe"';

let listaPalavras = text.split(" ");

let listaEmails = [];

listaPalavras.forEach((palavra) =>{
    if(palavra.includes("@")){
        listaEmails.push(palavra);
    }
});

console.log(listaEmails);

Poderíamos ter uma lista de e-mails filtrada com base no @. Mas dai você pode se perguntar se “@Joao” entre outras possíveis variações tanto devido ao conteúdo do texto quanto a possíveis erros de digitação. Com isso podemos acabar tendo um código como o abaixo:

let text = '@rediffmail.com blablabla farkal@gmail.com teste@@@ rodnsdfald ferdfnson <rfernsdfson@gmal.com> Affdmdol Gondfgale gyfanamosl@gmail.comtruform techno pidfpinfg@truformdftechnoproducts.com "NiTsdfeSh ThIdfsKaRe"';

let listaPalavras = text.split(" ");

let listaEmails = [];

listaPalavras.forEach((palavra) =>{
    if(palavra.includes("@") 
        && palavra[0] != "@" 
        && palavra.includes(".co")
        && palavra.includes(palavra.substr(0, palavra.indexOf("@"))) != "!"){
        listaEmails.push(palavra);
    }
});

console.log(listaEmails);

E isso é só o começo, estre IF teria que ser muito maior.

Mas existe uma solução usando REGEX (conheça o Regex aqui) que faz diversas conferencias ao mesmo tempo e permite a extração em poucas linhas. Veja o exemplo:

let text = '@rediffmail.com blablabla farkal@gmail.com teste@@@ rodnsdfald ferdfnson <rfernsdfson@gmal.com> Affdmdol Gondfgale gyfanamosl@gmail.comtruform techno pidfpinfg@truformdftechnoproducts.com "NiTsdfeSh ThIdfsKaRe"';

let listaEmails = text.match(/([a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9._-]+)/gi);

console.log(listaEmails);

Espero que este snippet ajude mais alguém como me ajudou. Deixe sua duvida ou comentário na sessão abaixo caso você tenha notado algo que possa melhorar ou caso esses snippet ajudou você

Efeito de scroll com Jquery

Este será um post bem rápido para mostrar um snippet de código que me ajudou a reduzir 1 biblioteca e manteve um efeito legal de scroll nos sites de uma página (as conhecidas landing pages).

Segue o snippet abaixo

$('html, body').animate({
    scrollTop: ($("objetoParaOndeIr").offset().top)
},500);

Como você pode ver não precisa fazer muito.

Para uma página Html que possui um menu com varios links apontando para sessoes especificas do site, você teria algo similar ao exemplo abaixo:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>teste</title>
</head>
<body>
    <section style="min-height: 75vh;">
        <a href="#sessao1">sessao1</a>
        <a href="#sessao2">sessao2</a>
        <a href="#sessao3">sessao3</a>
        <a href="#sessao4">sessao4</a>
    </section>
    <section id="sessao1" style="min-height: 75vh; background-color: aqua;"><h1>sessao1</h1></section>
    <section id="sessao2" style="min-height: 75vh; background-color: burlywood;"><h1>sessao2</h1></section>
    <section id="sessao3" style="min-height: 75vh; background-color: darkgray;"><h1>sessao3</h1></section>
    <section id="sessao4" style="min-height: 75vh; background-color: goldenrod;"><h1>sessao4</h1></section>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script>
        $("a").click(function () {
            console.log(this);
            $('html, body').animate({
                scrollTop: ($(this.hash).offset().top)
            }, 500)
        })

    </script>
</body>
</html>

 

Loop for com espera entre iterações

Recentemente tive uma duvida, como fazer para que um for tivesse esperasse alguns segundos entre cada iteração? Supodo que eu queira exibir um alerta em 10 vezes a de 5 em cindo segundos, como posso fazer com que o JavaScript espere estes 5 segundos?

Existem timers em JavaScript, como setInterval e setTimeout. SetInterval é um método de execução de código baseado em intervalo de tempo que tem a capacidade nativa de executar repetidamente um script especificado quando o intervalo é atingido. setTimeout é um método de execução de código baseado em tempo que executará um script apenas uma vez quando o intervalo for atingido.

Tendo isto em mente, a primeira coisa que tentei foi colocar o setTimeout dentro do for para tentar obter essa espera

function timeoutFunction()
{
  console.log("Iniciando Teste");
  for(i = 0; i < 10; i++) {
    setTimeout(function () {
      console.log("Teste "+i);
    }, 5000);
  }
}
timeoutFunction();

Após o primeiro log, há um atraso de 5s, mas quando os logs dentro do setTmeout ocorrem em grupo

Por que isso acontece?

A função setTimeout() é uma função que roda em outra thread e por isso ela não bloqueia a execução do for, ou seja a função é invocada e o código segue executando sem precisar esperar que ela termine. Com isso ele executará as 10 execuções em questão de milisegundos e todos os tempos de espera ocorreram praticamente juntos.

Como adicionar o delay no loop for?

A Expressão de Função de Chamada Imediata (IIFE – Immediate Invoking Function Expression) pode ser usada para obter o que queremos. Sua sintaxe funciona da seguinte forma:

(function () {

})();

O IIFE chama imediatamente uma função. Isso significa simplesmente que a função é executada imediatamente após a conclusão da definição. Se utilizarmos essa função, obteremos a saída desejada

console.log("Iniciando Teste");
for (var i = 0; i < 10; i++) {
  (function (i) {
    setTimeout(function () {
      console.log("Teste" + i);
    }, 5000*i);
  })(i);
};

O código acima, mesmo que você nunca tenha usado uma IIFE é simples, nó passamos a varável “i” como parametro da função (pois se tentarmos acessa-lo direto do loop o settimeout conseguirá obter apenas a iteração final com i = 9) e fazemos uma matemática simples para que as funções executem de forma a serem 5 segundos X nº iteração.

Estimando a velocidade de download com Imagens

Neste post será mostrado uma forma de estimar a velocidade de download utilizando uma imagem e algumas linhas de código JavaScript. A ideia do algoritmo é a de:

  • Fornecer uma imagem de tamanho grande para calcular de forma mais confiável.
  • Iniciar um contador um passo antes de baixar a imagem.
  • Baixar a imagem.
  • Encerrar o contador no momento que a imagem termina.
  • Calcular o resultado em MBps e Mbps.

O Código HTML

Abaixo o segue o código HTML. Como você pode ver, para manter tudo simples, serão utilizadas apenas algumas linhas de código e a exibição de resultados será de apenas um texto com os dados

<!DOCTYPE html>
<html>
<head>
    <title>Teste de Velocidade</title>
    <meta charset="utf-8" />
</head>
<body>
    <!-- O botão que irá iniciar o teste -->
    <button onclick="iniciarTeste()">Iniciar</button>

    <!-- Tag de paragrafo que exibirá os resultados -->
    <p id="progresso"></p>
    
    <script src="main.js"></script>
</body>
</html>

 

O Código JavaScript

A explicação do código JavaScript abaixo está dentro dos comentários de cada trecho.

// Variaveis para controlar o inicio e o fim do download
let inicioDownload;
let fimDownload;

// Variavel que guarda os dados da imagem que serão utilizados
const imagem = {
    // Caminho da imagem. Utilize o caminho da sua imagem
    caminho: "coffe-cup.jpg",

    // O tamanho da imagem em megabytes
    tamanho: 6.877555
};

// Inica o teste de Download
// Se outros recursos estiverem sendo baixados
function iniciarTeste() {
    mostrarMensagem("Efetuando teste de Download...");
    window.setTimeout(medirConexao(), 1);
}


// Função auxiliar que exibe mensagens na tela
function mostrarMensagem(messagem) {
    // Se a variavel mensagem for uma string, exibirá ela como veio,
    // Se a variavel for um vetor, exibirá cada linha quebrado por <br/>
    let mensagemHTML = (typeof messagem == "string") ? messagem : messagem.join("<br />");
    document.getElementById("progresso").innerHTML = mensagemHTML;
}

// Função que efetivamente mede a conexao de velocidade
function medirConexao() {
    // Cria o objeto de imagem que iremos calcular o tempo de download
    let imagemTeste = new Image();

    // No envento de carregamento da emnsagem,
    // para o contador e exibe o os resultados
    imagemTeste.onload = function () {
        endTime = new Date().getTime();
        exibirResultados();
    }

    // Inicia o contador 
    startTime = new Date().getTime();
    // cria uma controlador apra evitar carregar um caminho de imagem que ja está em cache
    let cacheBuster = "?nnn=" + startTime;
    // inicia a imagem
    imagemTeste.src = imagem.caminho + cacheBuster;
}

// Exibe os resultados caculados em Megabytes por segundo
// e em Megabits por segundo
function exibirResultados() {
    // converte o tempo de milisegundos para segundis
    let duracao = (endTime - startTime) / 1000;
    // calcula o tempo que levou para baixar a imagem,
    // arredondando para duas casas decimais
    let velocidadeMbps = (imagem.tamanho / duracao).toFixed(2);
    
    mostrarMensagem([
        "A Velocidade da conexão é de:",
        velocidadeMbps + " MBps",
        (velocidadeMbps * 8) + " Mbps"
    ]);
}

Conclusão

Após rodar os testes algumas vezes, foi possível observar as seguintes coisas.

  1. O resultado sempre se apresentou abaixo do que seria a capacidade da internet na minha casa.
  2. Caso outras páginas estivessem sendo acessadas, o resultado era muito inferior ao esperado.

Apesar dos itens acima terem sido esperados, foi interessante compara-los com sites que exibem a velocidade da internet para ver o preciso é o teste em relação a eles.

API Network Information: Obtenha dados de conexão do usúario

É comum usar a largura da tela ou indicadores semelhantes para decidir quantos dados mostrar ao usuário. Mas, às vezes, um usuário com uma tela maior ou dispositivo de maior resolução tem uma conexão de rede ruim, e enviá-las para imagens maiores torna as coisas muito mais lentas para eles no carregamento do site. Seria ótimo se pudéssemos explicar as condições de rede de um usuário específico para determinar o que devemos enviá-las.

A API de informações da rede faz exatamente isso. É uma API que fornece informações sobre a conexão do sistema em termos ou tipo de conexão (por exemplo, “wifi”, “celular” etc.) que podemos usar para otimizar a experiência deles.

Acessar dados do objeto Navegador

Navigator.connection é a propriedade principal que analisaremos. É somente leitura e contém algumas informações potencialmente valiosas sobre a conexão do usuário.

let connectionInfo = navigator.connection;

Isso retorna um objeto que possui as seguintes propriedades.

Propriedades da API Network Information

  • Downlink: Retorna a estimativa de largura de banda efetiva em megabits por segundo.
  • DownlinkMax: Retorna a velocidade máxima de downlink para a tecnologia de conexão subjacente.
  • EffectiveType: retorna o tipo de conexão efetivo que significa uma das opções “slow-2g”, “2g”, “3g” ou “4g”.
  • Rtt: Retorna o tempo de ida e volta estimado estimado da conexão atual.
  • Type: retorna o tipo de conexão que um dispositivo está usando para se comunicar com a rede.
    • Inclui: “bluetooth, celular, ethernet, nenhum, wifi, wimax, outro, desconhecido”.

Nota: Atualmente, os navegadores de desktop não retornam as propriedades downlinkMax e type.

Eventos

Também podemos adicionar listeners para o evento “onchange”, que dispara quando as informações de conexão são alteradas.

Exemplos

O benefício óbvio de ter essas informações é que podemos personalizar a experiência do usuário não apenas com base no tamanho da tela, mas também em como o usuário está se conectando ao nosso site. É sobre wi-fi ou celular? É um 3g ou 4g, etc?

let preloadVideo = true;
let connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;

if (connection) {
    if (connection.type === 'cellular') {
        preloadVideo = false;
    }
}

Por exemplo, poderíamos determinar se pré-carregaremos os ativos com uso intensivo de recursos, como vídeo, com base na conexão de rede, decidindo não pré-carregar os recursos se eles estiverem em excesso no celular.

Suporte

Infelizmente, o suporte para essa API é mínimo no momento, com o Chrome e o Opera sendo os principais navegadores para suporte a dispositivos móveis e o Chrome para computador.

A boa notícia, porém, é que, embora não possamos usar isso para todos, ainda podemos usá-lo para melhorar progressivamente nossos sites para alguns de nossos usuários. E com os benefícios potenciais que poderia oferecer quando estiver amplamente disponível, é definitivamente uma API para ficar de olho em seguir em frente.

Fonte:

MDN Docs: NetworkInformation
MDN Docs: Navigator.connection
Tradução principal: https://www.afasterweb.com/2018/01/26/network-api/

Utilizando Async Await com Expressjs

Hoje eu irei demonstrar como nós podemos utilizar Async/Await em um projeto Node.js com express.js.

O Objetivo desse artigo não será abordar o que é async e nem o porque utilizar ele (caso não saiba veja o artigo ES8: Funções Assíncronas), será algo rápido para demonstrar como trabalhar com ele em um projeto node com o framework expressjs.


Para pular a etapa de criação de um novo projeto, eu irei utilizar um que eu desenvolvi em um artigo anterior sobre:Criando uma API Node com Express.js. Caso você tenha interesse em clonar ele, segue o seu link no meu GitHub: node-express.

Para que possamos ter um cenário mais próximo do nosso dia a dia, eu irei fazer uma requisicão a uma URL externa. Existem muitos pacotes para isso, mas nesse artigo eu irei utilizar o pacote resquest.

Abra um terminal no seu computador e execute o comando abaixo:

npm install request --save-dev

O próximo passo será atualizar a nossa rota GET para que ela possa requisitar uma API externa. Para isso, abra o seu arquivo /src/controllers/personController.js e atualize ele com o trecho de código abaixo:

var request = require("request");

exports.get = async (req, res, next) => {
  console.log("chamando");
  await request("http://www.google.com", function(error, response, body) {
    res.json(body);
  });
};

Em seguida, execute o comando npm start no seu terminal, esse comando ira executar o projeto no seguinte endereço: http://localhost:3000/person.

Abra esse endereço no seu navegador.

Caso tudo esteja OK, você irá receber o resultado da imagem abaixo:

resultado node com Async Await

Bem simples né?

O objetivo desse artigo foi demonstrar como utilizar o Async/Await com Node e o Express.js. Espero que tenham gostado e até um próximo artigo pessoal.