Criando Pokedéx com React – Parte 1

Olá pessoal, hoje criaremos uma pokedex usando React e utilizando o PokeAPI para obter os dados dos pokémon. Para isso, precisamos entender sobre o fetch. Caso você não conheça o assunto, sugiro a leitura deste artigo. Mãos à obra.

Instalando React App

No seu prompt de comando (CMD), coloque o seguinte comando:

npm install –g create-react-app

Isso instalará o react-app globalmente. Agora, precisamos criar a pasta do projeto. Utilize o comando:

create-react-app pokedex

E, criada a pasta do projeto, entraremos nela:

cd pokedex

Você encontrará uma pasta chamada src dentro do seu arquivo pokedex. Exclua o arquivo logo.svg, ele não será utilizado.

Dentro da pasta src, criaremos uma pasta chamada test e outra pasta chamada components. Dentro da pasta components, crie uma pasta chamada styles.

Mova o arquivo App.js para a pasta components, o arquivo App.css para a pasta style. Mova o arquivo App.test.js para a pasta test.

Vamos aos códigos:

Abrindo o arquivo App.js e reescreva o conteúdo com o código a seguir:

import React, { Component } from 'react';
import './styles/App.css';
class App extends Component {
  render() {
    return (
      <div className="App">
        Ola Mundo
      </div>
    );
  }
}

export default App;

Agora, abra o seu arquivo App.css e delete o seu conteúdo. Ele será reescrito posteriormente.

No arquivo index.css, reescreva o conteúdo com o código a seguir:

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 0;
  font-family: 'Avenir Next', sans-serif;
}

h1,
h2,
h3,
h4,
p {
  margin: 0;
}

Este arquivo contém todos os nossos estilos top-level. Removemos todas as margens das tags h1, h2, h3, h4 e p e também, queremos que os elementos tenham o tamanho do border-box.

No arquivo index.js, precisamos importar os componentes do React, ReactDOM e os componentes do nosso App.

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './components/App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(<App />, document.getElementById('root'));
serviceWorker.unregister();

Esse arquivo diz para o DOM renderizar o componente App no elemento com o ID “root”. O nosso componente APP conterá todos os componentes, que serão construídos. Para iniciar a aplicação, inicie com o comando:

npm start

E isso iniciará a nossa aplicação no navegador, então, toda vez que criarmos alterações no projeto. Se acontecer algum erro, o navegador exibirá informações sobre o erro.

Gostou? Fique atento aos próximos artigos!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-1-e1ba0b9387a7

Receba o conteúdo diretamente no seu celular ou PC!

logo

Olá pessoal! O MundoJS possui uma ferramenta bem interessante que possibilita que você receba os nossos conteúdos diretamente na sua barra de notificações. Isso significa que, a cada vez que uma nova postagem for lançada, você receberá diretamente uma notificação no seu smartphone! Essa ferramenta também funciona no seu computador ou laptop, basta você ativar e receberá as notificações no seu computador!

E como eu posso ativar essa ferramenta?

Tudo o que você precisa fazer é clicar no sino que se encontra no canto inferior direito da página, em um botão vermelho!

No computador:

  • Abra o site do MundoJS;
  • Localize o botão vermelho com um sino;
  • Permita que o seu navegador exiba as notificações.

 

No seu Smartphone:

  • Abra o site do MundoJS;
  • Localize o botão vermelho com um sino;
  • Selecione-o;
  • Veja a notificação na sua barra de notificações!

É isso pessoal! Inscrevam-se e aproveitem em primeira mão as nossas novas postagens! Obrigado!

Criando Pokedéx com React – Parte 3

Começando a parte 3 do nosso tutorial, criaremos os primeiros componentes Stateless. Configuraremos o PokeList e renderizaremos todas as PokeCells com seus sprites. Vamos começar!

PokeList:

Na pasta componentes, criaremos um arquivo chamado PokeList.js e, na pasta styles, criaremos um arquivo chamado PokeList.css.

Os componentes stateless têm uma configuração mais curta. Esses tipos de componentes são funções JavaScript que retornam jsx.

No seu arquivo PokeList.js, você irá:

  1. Importar o react;
  2. Importar o pokelist.css;
  3. Criar uma função chamada PokeList;
  4. Retornar uma seção vazia com a className “poke-list”;
  5. Exportar a função recém-criada.
import React from 'react';
import './styles/PokeList.css';

const PokeList = () => {
    return (
        <section className="poke-list">

        </section>
    )
}
  

Vá para o PokeList.css e adicione o seguinte css:

.poke-list {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    align-items: center;
    width: 50%;
    height: 80%;
    padding: 10px;
    margin-right: 10px;
    background-color: #BFF9FF;
    box-shadow: inset 0 0 20px rgba (0, 0, 0, 0.5);
    overflow: scroll;
}

Usamos o display: flex para tirar proveito da funcionalidade de quebra automática. Definimos a largura para 50% para preencher a metade esquerda do componente do aplicativo e também incluímos rolagem de estouro porque nem todas as PokeCells serão exibidas de uma só vez.

Agora, precisamos voltar ao nosso App.js e importar o componente PokeList. Para renderizá-lo, colocaremos o componente PokeList como uma tag html dentro do elemento pai. Veja só:

PokeCell:

Construiremos um componente PokeCell que funcionará como um modelo para cada um dos 150 Pokémons que renderizaremos no PokeList. Crie um arquivo PokeCell.js na pasta componentes e, na pasta styles, um arquivo PokeCell.css.

No arquivo PokeCell.js:

  1. Importe o React;
  2. Importe o PokeCell.css;
  3. Crie uma nova função chamada PokeCell;
  4. Retorne um botão vazio com o className “poke-cell”;
  5. Exporte a função recém-criada:
import React from 'react';
import './styles/PokeCell.css';

const PokeCell = () => {
    return <button className='poke-cell'></button>
};

export default PokeCell;

Vá para o arquivo PokeCell.css e adicione o seguinte css:

.poke-cell {
    width: 120px;
    height: 120px;
    margin: 10px;
    background-color: #FFF;
    background-repeat: no-repeat;
    border: none;
    border-radius: 5px;
    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16);
}

Finalmente, importaremos o PokeCell dentro do nosso PokeList.js e renderizaremos algumas células na lista colocando-os dentro do elemento pai como um html.

Sprites e Renderização de Matriz:

Faça o download desses recursos:

Sprites

pokeClasses

A imagem sprites é uma coleção dos primeiros 151 sprites Pokemon. Exibiremos cada Sprite usando o componente PokeCell e algumas propriedades de plano de fundo do CSS (background-image, background-position).

As background-positions podem ser achadas no arquivo pokeClasses.js, que possuem um array de objetos contendo o id e posição de cada Pokemón para cada Sprite.

  1. Dentro do diretório src, insira o arquivo pokeClasses.js;
  2. Cria uma pasta chamada assets dentro deste diretório, e coloque a imagem de sprites dentro da pasta assets.

Dentro do arquivo PokeList.js, importe o pokeClasses:

import React from 'react';
import PokeCell from './PokeCell';
import { pokeClasses } from '../pokeClasses';
import './styles/PokeList.css';

const PokeList = () => {
    return (
        <section className="poke-list">
            <PokeList />
            <PokeList />
            <PokeList />
        </section>
    )
}

export default PokeList;

Precisamos renderizar a lista de todos os 151 PokeCells com os dados corretos neles. No nosso código, crie um array de PokeCells com as informações de cada elemento do array pokeClasses.

Para isso, utilizaremos o array prototype map ao nosso array pokeClasses e, para cada elemento do array, retornará uma tag PokeCell. Em seguida, armazene esse array em uma nova constante chamada cells.

const cells = pokeClasses.map(pokeClass => <PokeCell />)

Vamos usar props para passer o objeto pokeClass para cada PokeCell. Podemos nomear props da maneira que quisermos e passar qualquer tipo de variável (string, número, objeto, função) por eles. Para fazer isso, adicione um novo prop chamado pokeClass dentro da tag PokeCell. Em seguida, atribua a ele o argumento pokeClass do retorno de chamada do map. Sempre que incluirmos JavaScript regular em um jsx, precisamos envolve-lo com chaves:

const cells = pokeClasses.map(pokeClass => <PokeCell pokeClass = {pokeClass}/>)

Cada pokeClass contém um valor de ID, que podemos usar como nosso valor exclusivo da prop. O resultado será:

import React from 'react';
import PokeCell from './PokeCell';
import { pokeClasses } from '../pokeClasses';
import './styles/PokeList.css';

const PokeList = () => {
    const cells = pokeClasses.map(pokeClass => {
        return (
            <PokeCell 
                key = {pokeClass.id}
                pokeClass={pokeClass}
            />
        );
    });

    return (
        <section className="poke-list">

        </section>
    )
}

export default PokeList;

E agora que temos nosso vetor PokeCells, renderizaremos ele colocando a variável cells dentro do elemento pai, envolto em chaves:

import React from 'react';
import PokeCell from './PokeCell';
import { pokeClasses } from '../pokeClasses';
import './styles/PokeList.css';

const PokeList = () => {
    const cells = pokeClasses.map(pokeClass => {
        return (
            <PokeCell 
                key = {pokeClass.id}
                pokeClass={pokeClass}
            />
        );
    });

    return (
        <section className="poke-list">
            {cells}
        </section>
    )
}

export default PokeList;

E a saida será:

Renderizando Sprites:

Agora que passamos o objeto pokeClass para cada PokeCell, usaremos esses dados para determinar a posição de cada Sprite na imagem do Sprite e renderizá-lo no fundo de cada botão.

No seu arquivo PokeCell.js, passaremos props para o PokeCell, precisamos incluir um argumento de props na função PokeCell. Como sabemos que o objeto props contém o objeto pokeClass, podendo desconstruir o argumento props para acessar o objeto pokeClass.

const PokeCell = ({pokeClass}) => {
    const {id, backgroundPosition} = pokeClass;
    
    return <button className='poke-cell'></button>
};

Em seguida, importe a imagem dos sprites:

import sprites from '../assets/sprites.png';

Para adicionar o sprite como uma imagem de plano de fundo, usaremos o estilo embutido no elemento button. Crie um novo objeto de estilos com duas propriedades: backgroundImage e backgroundPosition. Usaremos a função css url:

const style = {backgroundImage: `url (${sprites})`, backgroundPosition};

E ficaria assim o código:

import React from 'react';
import sprites from '../assets/sprites.png';
import './styles/PokeCell.css';
const PokeCell = ({ pokeClass }) => {
  const { id, backgroundPosition } = pokeClass;
  const style = { backgroundImage: `url(${sprites})`, backgroundPosition};

  return <button style={style} className="poke-cell"></button>
};

export default PokeCell;

E assim será a sua saída:

E assim termina a parte 3 da nossa sequência de artigos! Comente abaixo!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-3-5d0114361424

Exportando arquivos JSON com MongoDB

Olá, hoje exportaremos arquivos JSON com o MongoDB. O MongoDB é um banco de dados não-relacional que traz o conceito de Banco de Dados Orientado a Documentos. Ele tem como característica conter informações importantes em um único documento. Deste modo, possibilita a consulta de documentos através de métodos avançados de agrupamento e filtragem.

Caso você não conheça o MongoDB e não saiba fazer um CRUD básico, recomendo a leitura do artigo:

https://www.mundojs.com.br/2020/03/17/crud-basico-com-mongodb/

Caso já conheça, mas queira importar arquivos CSV, recomendo o seguinte artigo:

https://www.mundojs.com.br/2020/03/27/importando-arquivos-com-mongodb/

E arquivos JSON:

https://www.mundojs.com.br/2020/03/30/importando-arquivos-json-com-mongodb/

Com o seu mongoDB devidamente configurado, começaremos a exportar os arquivos.

Primeiro, precisamos abrir o diretório em que trabalharemos. Utilize o comando cd diretorio para especificar o diretório a ser trabalhado.

Utilizando o comando mongoexport, precisamos especificar o nosso host, que no meu caso é 127.0.0.1. Após isso, utilizaremos a sintaxe –db nomedodocumento, que especifica em qual documento está o arquivo a ser exportado. Caso não exista, será criado.

Utilizaremos também a sintaxe –collection nomedacollection, que cria/especifica qual a coleção.

Especificados o host, nome do documento e nome da collection, precisamos especificar o nome do arquivo + extensão a ser exportado. Como já sabemos, o nosso arquivo é o example_2.json, e você usa a sintaxe –out para isso.

Utilizaremos os métodos –jsonArray para trazer os documentos JSON em um único array e –pretty, para trazer o documento formatado.

E o comando ficará assim:

mongoexport --host=127.0.0.1 --db quiz --collection listaquiz --out example_2.json --jsonArray --pretty

E a saída será:

connected to: mongodb://127.0.0.1/
exported 1 record

Com isso, exportamos nosso arquivo JSON com sucesso!

Verifique o diretório para confirmar a exportação do seu arquivo JSON.

Gostou deste artigo? Comente abaixo!

Importando arquivos JSON com MongoDB

Olá, hoje importaremos arquivos JSON para o MongoDB. O MongoDB é um banco de dados não-relacional que traz o conceito de Banco de Dados Orientado a Documentos. Ele tem como característica conter informações importantes em um único documento. Deste modo, possibilita a consulta de documentos através de métodos avançados de agrupamento e filtragem.

Caso você não conheça o MongoDB e não sabia fazer um CRUD básico, recomendo a leitura do artigo:

https://www.mundojs.com.br/2020/03/17/crud-basico-com-mongodb/

Caso já conheça, mas queira importar arquivos CSV, recomendo o seguinte artigo:

https://www.mundojs.com.br/2020/03/27/importando-arquivos-com-mongodb/

Agora que você já leu, vamos lá!

Para realizar este exemplo, utilizei o site: https://support.oneskyapp.com/hc/en-us/articles/208047697-JSON-sample-files que disponibiliza vários tipos de arquivos JSON como exemplo. Para o nosso exemplo, utilizaremos o arquivo example_2.json, que contém um quiz sobre esportes.

Com o seu mongoDB devidamente configurado, começaremos a importar os arquivos.

Primeiro, precisamos abrir o diretório em que trabalharemos. Recomendo deixar o arquivo json a ser importado no mesmo diretório. Utilize o comando cd diretorio para especificar o diretório a ser trabalhado.

Utilizando o comando mongoimport, precisamos especificar o nosso host, que no meu caso é 127.0.0.1. Após isso, utilizaremos a sintaxe –db nomedodocumento, que especifica em qual documento será importado. Caso não exista, será criado.

Utilizaremos também a sintaxe –collection nomedacollection, que cria/especifica qual a coleção. Caso ela não exista, será criada.

Especificados o host, nome do documento e nome da collection, precisamos especificar o nome do arquivo + extensão a ser importado. Como já sabemos, o nosso arquivo é o example_2.json, e você usa a sintaxe –file para isso.

E o comando ficará assim:

mongoimport --host=127.0.0.1 --db quiz --collection listaquiz --file example_2.json

E a saída será:

connected to: mongodb://127.0.0.1/

1 document(s) imported successfully. 0 document(s) failed to import.

Com isso, importamos o nosso arquivo JSON com sucesso!

Utilizando o find(), verificamos que foi importado:

Gostou deste artigo? Comente abaixo!

Importando arquivos CSV com MongoDB

Olá, hoje importaremos arquivos para o MongoDB. O MongoDB é um banco de dados não-relacional que traz o conceito de Banco de Dados Orientado a Documentos. Ele tem como característica conter informações importantes em um único documento. Deste modo, possibilita a consulta de documentos através de métodos avançados de agrupamento e filtragem.

Caso você não conheça o MongoDB e não sabia fazer um CRUD básico, recomendo a leitura do artigo:

https://www.mundojs.com.br/2020/03/17/crud-basico-com-mongodb/

Agora que você já leu, vamos lá!

Para realizar este exemplo, utilizei o site: https://people.sc.fsu.edu/~jburkardt/data/csv/csv.html que disponibiliza vários tipos de arquivos CSV. Para o nosso exemplo, utilizaremos o arquivo cities.csv, que contém diversos dados sobre cidades dos Estados Unidos.

Com o seu mongoDB devidamente configurado, começaremos a importar os arquivos.

Primeiro, precisamos abrir o diretório em que trabalharemos. Recomendo deixar o arquivo csv a ser importado no mesmo diretório. Utilize o comando cd diretorio para especificar o diretório a ser trabalhado.

Utilizando o comando mongoimport, precisamos especificar o nosso host, que no meu caso é 127.0.0.1. Após isso, utilizaremos a sintaxe -d nomedodocumento, que especifica em qual documento será importado. Caso não exista, será criado.

Utilizaremos também a sintaxe -d nomedacollection, que cria/especifica qual a coleção. Caso ela não exista, será criada.

Agora, precisamos especificar o tipo de arquivo que será importado. No nosso caso, é um arquivo CSV, mas nad aimpede você importar outros arquivos, como JSON etc. Para isso, utilizaremos a sintaxe –type csv.

Especificados o host, nome do documento, nome da collection e o tipo de arquivo, precisamos especificar o nome do arquivo + extensão a ser importado. Como já sabemos, o nosso arquivo é o cities.csv, e você usa a sintaxe –file para isso.

Por último, e não menos importante, usamos o comando –headerline que, em extensões do tipo csv ou tsv, especifica que a primeira linha da tabela será o nome das colunas.

E o comando ficará assim:

mongoimport --host=127.0.0.1 -d enderecos -c listaenderecos --type csv --file cities.csv --headerline

E a saída será:

connected to: mongodb://127.0.0.1/

128 document(s) imported successfully. 0 document(s) failed to import.

Com isso, importamos o nosso arquivo CSV com sucesso!

Utilizando o find(), verificamos que foi importado:

Gostou deste artigo? Comente abaixo!

Introdução ao Puppeteer, uma biblioteca NodeJS

O Puppeteer é uma biblioteca que fornece uma API de alto nível para controlar o Chrome ou o Chromium através do Protocolo DevTools.

A maioria das coisas que você pode realizar manualmente pelo navegador pode ser feita usando o Puppeteer. Como por exemplo:

  • Gerar Screenshots e PDF’s de páginas;

  • Rastrear um SPA (Single-Page Application) e gerar conteúdo pré renderizado;

  • Automatizar o envio de formulários, testes de interface do usuário, entrada de teclado etc;

  • Criar ambiente de testes automatizado e atualizado;

  • Executar os testes diretamente na versão mais recente do Chrome usando os recursos mais recentes de JavaScript;

  • Capturar um rastreamento da linha do tempo do seu site para ajudar no diagnóstico de problemas de desempenho;

  • Testar as extensões do Chrome.

Instalação

Para utilizar o Puppeteer no seu projeto, execute:

npm i puppeteer
# ou “yarn add puppeteer”

Quando você instala o Puppeteer, ele baixa uma versão recente do Chromium.

O Puppeteer será familiar para as pessoas que usam outros frameworks de teste do navegador. Você cria uma instância do Navegador, abre páginas e as manipula com a API do Puppeteer.

Crie seu arquivo e o salve como example.js.

Tirar ScreenShot:

Neste exemplo, navegaremos até a página https://example.com e salvaremos uma captura de tela como example.png:

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    // Navega até a pagina destino
    await page.goto('https://example.com');
    // Tira um Screenshot da página
    await page.screenshot({path: 'example.png'});
    await browser.close();
})();

Execute o script na linha de comando:

node example.js

Criando um PDF:

Podemos utilizar o Puppeteer para criar um PDF da página, adicionando o seu formato de folha:

Salve o seu arquivo como criarPdf.js

const puppeteer = require ('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    // Especifica qual a página a ser transformada em PDF
    await page.goto('https://example.com', {waitUntil:'networkidle2'});
    // Salva o arquivo em PDF
    await page.pdf({path: 'criarPdf.pdf', format: 'A4'});
    await browser.close();
})();

Execute o comando:

node criarPdf.js

Descobrindo dimensões da viewport do site:

Você pode descobrir as dimensões da viewport de um site, capturando o width e height da viewport do site especificado.

Salve seu arquivo como getDimensions.js

const puppeteer = require('puppeteer');

(async ()=> {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');

    // Obtendo o viewport da página
    const dimensions = await page.evaluate(() => {
        return {
            // Retorna o width da viewport
            width: document.documentElement.clientWidth,
            // Retorna o height da viewport
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio
        };
    });

    console.log('Dimensions:', dimensions);
    await browser.close();
})();

Execute o comando:

node getDimensions.js

E esta será a sua resposta. Um objeto com os valores de largura, altura e fator de escala do dispositivo.

Gostou deste artigo? Comente abaixo!

Buscando dados de Geolocalização com IP-API

Olá pessoal. Neste artigo, irei mostrar como mostrar os dados advindos de um endereço IP utilizando o IP-API. Neste exemplo, iremos utilizar:

  • fetch;
  • async;
  • await.

Vamos lá?

Uma breve explicação sobre fetch:

O método fetch() fornece uma maneira fácil e rápida para buscar informações e recursos de uma forma assíncrona através da rede. Antes, essa funcionalidade era obtida com o XMLHttpRequest. O fetch() difere do jQuery.ajax(), principalmente nos quesitos de: A promise retornada do fetch() não rejeita status de erro HTTP, e só haverá rejeição se houver falha de rede ou impedimento da requisição ser completada e também o fetch() não envia nem recebe cookies do servidor.

Para mais informações sobre o fetch, acesse esse artigo.

Mãos à obra!

Para utilizarmos a IP-API, podemos acessar o site e sua documentação em:

https://ip-api.com/docs/api:json#test, onde é possível realizar testes, acessando os dados de diferentes IPs.

Ao código:

O primeiro passo é criarmos um documento HTML com um elemento <pre id=”json”></pre>:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>fetch IP API</title>
</head>
<body>
    <pre id="json"></pre>
    <script src="scripts.js"></script>
</body>
</html>

Adicione uma tag script que aponta para um arquivo “scripts.js” (que será criado agora).

Criando o script:

Crie um arquivo scripts.js no seu editor de texto preferido. Com o arquivo criado, iremos começar a escrever uma função assíncrona chamada fetchIpApi(). A estrutura será a seguinte:

async function fetchIpApi(){}

Agora, iremos utilizar o método try…catch para realizar o teste de verificação de funcionamento da API.

  • A instrução try define o bloco de código a ser testado enquanto ele está sendo executado;
  • A instrução catch permite definir um bloco de código a ser executado se ocorrer algum erro no bloco try.
async function fetchIpApi(){
    try{
    } catch(err) {
    }
}

Ok, agora que temos nossos blocos try…catch definidos, iremos criar uma variável response que vai receber um await e o fetch(requisição) da Ip-API. Iremos capturar os dados do IP DNS do Google (8.8.8.8) (Caso você não saiba o que é async/await, leia este artigo)

async function fetchIpApi(){
    try{
        // Criando uma requisição da API
        let response = await fetch('http://ip-api.com/json/8.8.8.8?fields=61439');
    } catch (err){
    }
}

Feita a requisição, precisamos agora de uma resposta desta requisição. Para isso, utilizaremos o método response.json(), que retorna uma promise com o conteúdo transformado em arquivo json. Crie uma variável chamada usuário para isso e a retorne:

async function fetchIpApi(){
    try{
        let response = await fetch('http://ip-api.com/json/8.8.8.8?fields=61439');
        // Crie a variável usuário e pegue a resposta da requisição
        let usuario = await response.json();
        return usuario;
    } catch (err){
        console.log(err);
    }
}

No nosso tratamento de erro, apenas vamos mostrar no console a ocorrência de algum erro.

Agora, para mostrar o nosso arquivo JSON no HTML, iremos utilizar o método .then(), que:

  • Capturará o elemento HTML com id=”json”;
  • Utilizará o innerText para mostrar as informações em tela;
  • Receberá o arquivo formatado, utilizando o JSON.stringify().
fetchIpApi().then(
    // JSON.stringify(dado, undefined, 2) traz o conteúdo formatado!
    dado =>document.getElementById("json").innerText = JSON.stringify(dado, undefined, 2)
);

E esse será o resultado no seu navegador:

O código JavaScript completo:

async function fetchIpApi(){
    try{
        let response = await fetch('http://ip-api.com/json/8.8.8.8?fields=61439');
        let usuario = await response.json();
        return usuario;
    } catch (err){
        console.log(err);
    }
}

fetchIpApi().then(
    dado =>document.getElementById("json").innerText = JSON.stringify(dado, undefined, 2)
);

Gostou deste artigo? Comente abaixo!

CRUD básico com MongoDB

O MongoDB é um banco de dados não-relacional que traz o conceito de Banco de Dados Orientado a Documentos. Ele tem como característica conter informações importantes em um único documento. Deste modo, possibilita a consulta de documentos através de métodos avançados de agrupamento e filtragem.

Ele é um banco de dados NoSQL, onde não há presença de SQL. Deste modo, este tipo de banco de dados não traz consigo os fundamentos de um modelo relacional e com a linguagem SQL. Os bancos de dados orientados a documentos não fornecem relacionamentos entre documentos, o que mantém seu design sem esquemas.

Instalando o MongoDB:

Você pode realizar a instalação do MongoDB acessando o site: https://docs.mongodb.com/manual/installation/ e selecionar o seu sistema operacional. Baixe a versão community. Baixe o arquivo no formato msi e siga o passo a passo da instalação.

Feito este procedimento, você obterá acesso ao aplicativo Shell do MongoDB. Através deste Shell, podemos criar banco de dados, documentos e coleções. Execute o arquivo mongo.exe.

Realizando CRUD:

Criando coleções:

O mongoDB utiliza o armazenamento de documentos em coleções. As coleções são equivalentes a tabelas em bancos de dados relacionais. Utilize o comando use db para acessar o banco de dados db.

Podemos utilizar criar uma coleção em documento utilizando o comando createCollection().

Vamos criar a collection chamada teste:

db.createCollection("teste")

A mensagem de resposta será:

{ “ok” : 1 }

Agora, podemos verificar se a coleção foi criada, usando o comando:

show collections

E lá está a nossa resposta:

teste

INSERT():

Agora, iremos realizar a nossa operação de inserção na nossa collection, utilizando o comando insert (create):

db.teste.insert({nome: "Usuario 1", idade: 25, data_nascimento: "01/03/1990"})

E obtemos o resultado:

WriteResult({ “nInserted : 1 })

Assim, inserimos na nossa collection teste um novo usuário, chamado Usuario 1, com idade = 25 e nascido no dia 01/03/1990.

FIND():

Com o comando find(), podemos verificar a existência da coleção e seus dados. Funciona de maneira semelhante ao select da linguagem SQL:

db.teste.find()

E o resultado será:

{ "_id" : ObjectId("5e6a69e61f94c569504d99e4"), "nome" : "Usuario 1", "idade" : 25, "data_nascimento" : "01/03/1990" }

Observação: Quando não especificamos um ID, o próprio MongoDB se encarrega da criação de um.

Utilizando o método pretty, você terá o resultado formatado:

db.teste.find().pretty():
{

        "_id" : ObjectId("5e6a69e61f94c569504d99e4"),

        "nome" : "Usuario 1",

        "idade" : 25,

        "data_nascimento" : "01/03/1990"

}

 

UPDATE():

Com o método update(), atualizaremos os campos da coleção que desejarmos. Passamos por parâmetro primeiro o nome do usuário a ser atualizado na tabela, e após, as suas novas informações.

db.teste.update({ nome: "Usuario 1" }, {nome: "Usuario 2", idade: 30, data_nascimento: "03/07/1992"})

E a nossa saída será:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Agora, verificamos se o update foi realizado:

db.teste.find().pretty()

E ali está:

{

        "_id" : ObjectId("5e6a69e61f94c569504d99e4"),

        "nome" : "Usuario 2",

        "idade" : 30,

        "data_nascimento" : "03/07/1992"

}

 

REMOVE():

Para remover um usuário de uma coleção, podemos utilizar o método remove(), especificando o usuário a ser removido:

db.teste.remove({ nome: "Usuario 2"})

Saída:

WriteResult({ "nRemoved" : 1 })

Você pode utilizar o find() e verificar. Não existirá mais esse usuário.

 

DROP():

Para remover uma collection inteira, utilize o comando drop():

db.teste.drop()

Utilize o comando show collections para verificar se a coleção foi realmente removida.

 

Então é isso pessoal, terminamos o CRUD básico no MongoDB. Espero que tenham gostado. Deixe seu comentário.

Criando canal de mensagens com RabbitMQ e Node.js

Olá pessoal! Hoje irei mostrar como criar um canal de mensagens usando RabbitMQ e Node.js. Primeiramente, você deve tê-los instalado na sua máquina. Você pode realizar o download do RabbitMQ em: https://www.rabbitmq.com/download.html e do NodeJS em: https://nodejs.org/pt-br/download/.

Vamos começar?

Primeiramente, temos que ter em mente o conceito de fila. Caso não conheça a estrutura de dado fila, dê uma olhada neste artigo: https://www.mundojs.com.br/2019/11/01/estrutura-de-dados-com-javascript-fila/ para podermos dar sequência à este artigo.

No RabbitMQ, temos um produtor de mensagens (P) e um consumidor (C). As mensagens ficam armazenadas dentro de uma fila. No diagrama abaixo, a caixa do meio é a fila. O produtor de mensagens envia uma mensagem para a fila, e o consumidor a recebe:

Enviando:

Crie um arquivo send.js, que será o arquivo do produtor de mensagens. No nosso send.js, precisamos realizar a requisição da biblioteca amqplib. Isso pode ser feito desta maneira:

let amqp = require('amqplib/callback_api');

Em seguida, conectaremos ao servidor RabbitMQ:

amqp.connect('amqp://localhost', function(error0, connection) {
    if (error0)throw error0;
});

Agora, criaremos um canal onde reside a API para a realização das tarefas, onde devemos declarar uma fila para o envio, e também publicar uma mensagem na fila:

amqp.connect('amqp://localhost', function(error0, connection) {
    if (error0) throw error0;
    connection.createChannel(function(error1, channel) {
        if (error1) throw error1;
        
        let queue = 'hello';
        let msg = 'Olá Mundo!';

        channel.assertQueue(queue, {
            durable: false
        });
        channel.sendToQueue(queue, Buffer.from(msg));

        console.log(" [x] Enviando %s", msg);
    });
});

Agora, precisamos fechar a conexão e sair:

setTimeout(function() {
    connection.close();
    process.exit(0);
}, 500);

E o nosso código do produtor de mensagens seria mais ou menos assim:

let amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
    if (error0) {
        throw error0;
    }
    connection.createChannel(function(error1, channel) {
        if (error1) throw error1;
        
        let queue = 'hello';
        let msg = 'Olá Mundo!';

        channel.assertQueue(queue, {
            durable: false
        });
        channel.sendToQueue(queue, Buffer.from(msg));

        console.log(" [x] Enviando %s", msg);
    });
    setTimeout(function() {
        connection.close();
        process.exit(0);
    }, 500);
});

Recebendo:

Agora, nosso consumidor precisa escutar as mensagens enviadas pelo arquivo send.js. O consumidor precisa ficar ativo para escutar as mensagens enviadas. Crie um arquivo chamado receive.js. Este arquivo terá a configuração parecida com o do arquivo send.js. Abrimos uma conexão, um canal e declaramos a fila que iremos consumir:

let amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function (error0, connection) {
    if (error0) throw error0;
    connection.createChannel(function (error1, channel) {
        if (error1) throw error1;
        let queue = 'hello';
        channel.assertQueue(queue, {
            durable: false
        });
     });
});

Queremos garantir a existência de uma fila para que o consumidor não fique iniciando antes do emissor. É exatamente isso que o channel.consume faz:

console.log(' [*] Esperando por mensagens em %s. Para sair pressione CTRL+C', queue);
channel.consume(queue, function (msg) {
    console.log(' [x] Recebida: %s', msg.content.toString());
    }, {
        noAck: true
    });

E o nosso código do consumidor ficaria assim:

let amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function (error0, connection) {
    if (error0) throw error0;
    connection.createChannel(function (error1, channel) {
        if (error1) throw error1;
        let queue = 'hello';
        channel.assertQueue(queue, {
            durable: false
        });
        console.log(' [*] Esperando por mensagens em %s. Para sair pressione CTRL+C', queue);
        channel.consume(queue, function (msg) {
            console.log(' [x] Recebida: %s', msg.content.toString());
        }, {
            noAck: true
        });
    });
});

Executando:

Agora, executando no terminal cada um dos arquivos, temos as seguintes saídas:

Produtor de mensagens:

Consumidor:

E assim está feito o nosso canal de emissão de mensagens!

Gostou deste artigo? Comente abaixo!