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.

Conheça o CylonJS, um framework para robótica

O Cylon.js é um framework JavaScript para robótica, computação física e Internet das Coisas (IoT). Ele fornece uma maneira simples, mas poderosa, de criar soluções que incorporam vários dispositivos de hardware diferentes simultaneamente. Deseja usar o Node.js para robôs, drones e dispositivos de IoT? Este é o framework certo.

Instalação:

Você pode utilizar o npm para instalar o módulo cylon:

npm install cylon

No ubuntu, você pode utilizar o apt-get para instalar o NodeJs na sua máquina, e assim, utilizar o npm:

sudo apt-get install nodejs

Com o módulo core instalado, você precisa instalar módulos de suporte de hardware necessários. Utilizaremos os módulos firmata, gpio e i2c. Esses módulos são utilizados no Arduino para a ligação de um LED.

npm install cylon-firmata cylon-gpio cylon-i2c

Hello World com Cylon.js:

Para criar uma aplicação Olá Mundo com o Cylon.js, você precisará:

  • Fazer a requisição do módulo cylon;
  • Utilizar o método Robot para logar o resultado no console;
  • utilizar o método start() para mostrar o resultado.
let Cylon = require('cylon');

Cylon.robot({
    work: function() {
        every((1).second(), function() {
            console.log("Olá Mundo!");
        });
    }
}).start();

Com isso, temos um Olá Mundo!

Arduino = LED + Botão

Este exemplo acende um LED ao clicar em um botão:

let Cylon = require('cylon');

Cylon.robot({
    connections: {
        arduino: { adaptor: 'firmata', port: '/dev/ttyACM0'}
    },

    devices: {
        led: { driver: 'led', pin: 13 },
        button: { drier: 'button', pin: 2}
    },

    work: function(my){
        my.button.on('push', function() {
            my.led.toggle()
        });
    }
}).start();

O Cylon.js pode ser executado diretamente no navegador, usando o módulo NPM do browserify. Você pode executá-lo usando um aplicativo conectado ao Chrome ou um aplicativo móvel PhoneGap.

Você pode ver mais alguns exemplos do Cylon.JS em ação, consulte a página de exemplos.

O Cylon.js fornece uma maneira simples e poderosa de criar soluções que incorporam vários dispositivos de hardware diferentes ao mesmo tempo.

Para verificar atualizações, notas e outros comentários sobre o Cylon.js , você pode acessar o blog do Cylon.js. Também pode acessar o GitHub.

O Cylon.js foi feito e atualizado pelo Hybrid Groud. É licenciado sob a licença Apache 2.0.

Gostou deste artigo? Comente abaixo!

Criando e lendo arquivo com File System e NodeJS

O módulo File System do Node.js permite o trabalho com o sistema de arquivos do computador. Com ele, podemos criar, atualizar, ler e excluir diversos tipos de arquivos, como .txt, .html, entre outros. Neste exercício, criaremos um arquivo txt com um pequeno texto e realizar sua leitura. O conteúdo deverá ser exibido no shell do NodeJS. Vamos começar?

1º Passo:

Crie um arquivo JavaScript chamado writeFile.js. Neste arquivo você precisará:

  • Criar uma requisição para o módulo file system;
  • Criar uma variável texto que receberá o seguinte parágrafo: Este é o texto que usaremos como exemplo para salvar em nosso arquivo txt;
  • Utilizar o método writeFile para criar um arquivo chamado ‘newfile.txt’ e inserir neste arquivo o conteúdo da variável texto.

2º Passo:

Crie um arquivo JavaScript chamado readFile.js. Neste arquivo, você precisará:

  • Criar uma requisição para o módulo file system;
  • Utilizar o método readFile para leitura do conteúdo do arquivo ‘newfile.txt’. Não esqueça de adicionar o ‘utf-8’ para codificação dos caracteres;
  • Utilize o console.log para mostrar o conteúdo do nosso arquivo no terminal do NodeJS.

Sua saída deverá ser assim:

Você pode realizar o download do código fonte aqui:

[download id=”3594″]

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!

Exercício fácil: async e await

Async e await são extensões das promises. Quando uma função assíncrona é chamada, ela retorna uma promise. Uma função assíncrona pode conter uma palavra-chave await, que pausa a execução da função e espera pela resolução da promise passada, retomando a execução após a resolução da promise e retornando o valor resolvido. A proposta das funções async/await é simplificar o uso de promises. Assim como promises são similares a callbacks estruturados, as funções async/await são similares à junção de generators com promises. Caso você não conheça o async/await, recomendo que antes de prosseguir, leia este artigo: Entenda o async e await.

Dito isto, vamos ao exercício:

Passo 1:

Crie uma função que após 5 segundos, dobre o resultado do número passado como parâmetro. Essa função deverá retornar uma promise. Use o setTimeOut como temporizador.

O corpo da função abaixo servirá como base para este exercício:

function dobrarEm5Segundos(x) {
  return new Promise( => {
    setTimeout(() => {      
    });
  });
}

Realizado este passo, podemos seguir adiante:

Passo 2:

Crie uma função assíncrona que irá receber um parâmetro x. Crie três variáveis: a, b e c dentro do corpo da função. Cada uma dessas variáveis receberá um await da função do passo anterior. Você deve passar como parâmetros dessa função os número 10, 20 e 30, respectivamente.

Retorne a soma de todos esses elementos, inclusive o parâmetro da função assíncrona.

async function addAsync(x) {
  let a;
  let b;
  let c;
  return;
}

Para mostrar o resultado no console, utilize o .then():

addAsync().then(() => {
  console.log();
});

Você pode realizar o download do exercício resolvido aqui:

[download id=”3580″]

Gostou deste exercício? Comente abaixo:

Entenda o async e await

Async e await são extensões das promises. Caso você não conheça promises, acesse o artigo seguinte e realize a leitura antes de prosseguir com async e await: https://www.mundojs.com.br/2020/03/02/o-que-sao-e-como-criar-promises/.

Quando uma função assíncrona é chamada, ela retorna uma promise. Uma função assíncrona pode conter uma palavra-chave await, que pausa a execução da função e espera pela resolução da promise passada, retomando a execução após a resolução da promise e retornando o valor resolvido.

A proposta das funções async/await é simplificar o uso de promises. Assim como promises são similares a callbacks estruturados, as funções async/await são similares à junção de generators com promises.

async:

A palavra async antes de uma função significa que a função sempre retorna uma promise. Outros valores serão agrupados em uma promise resolvida automaticamente. Por exemplo, esta função async retorna uma promise resolved com a string “Ola Mundo”:

async function funcaoAsync() {
    return 'Ola Mundo';
}

funcaoAsync().then(console.log);

E nós podemos retornar uma promise explicitamente, que retornaria a mesma coisa:

async function funcaoAsync(){
    return Promise.resolve('Ola Mundo')
}

funcaoAsync().then(console.log);

Então, o async garante que a função retorne uma promise.

Mas há outra palavra-chave, chamada await, que funciona apenas dentro de funções assíncronas.

await:

A palavra-chave await faz com que a função espere até que a promise seja estabelecida e retorne o seu resultado. Confira neste exemplo o seu funcionamento:

async function funcaoAsyncAwait() {
    // Criaremos uma promise que retornará a string 
    // "Promise concluída", após o tempo de 5 segundos.
    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("Promise concluída!"), 5000)
    });

    // Esta variavel resultado recebe o resultado da promise, após sua conclusão.
    let resultado = await promise;
    console.log(resultado);
}

funcaoAsyncAwait();

Nesta função, a execução “pausa” e somente retorna quando passa o tempo de execução da promise. Literalmente falando, o await aguarda a conclusão da promise para retornar o resultado! Então, você verá a string “Promise concluída” após 5 segundos de execução, que é o tempo que estabelecemos para a conclusão da promise.

Observação: Não podemos utilizar o await em função síncronas. Ele funciona somente em funções assíncronas, então, precisamos ter o async em nossa function.

Continue lendo “Entenda o async e await”

Utilizando o File System para atualizar, deletar e renomear arquivos

Dando sequência ao nosso artigo de File System do Node.js, já temos os métodos de ler e criar arquivos. Você pode conferir o artigo anterior no link:

Neste artigo, iremos mostrar os métodos:

  • Update
  • Delete
  • Rename

Vamos lá?

Update:

O file system possui os seguintes métodos:

  • fs.appendFile()
  • fs.writeFile()

O método fs.appendFile() anexa conteúdo no final do arquivo especificado:

// Primeiro criaremos uma requisição para o módulo fs
let fs = require('fs');
// Depois, especificamos o arquivo a ser atualizado
// e colocamos o conteúdo a ser anexado.
fs.appendFile('meuNovoArquivo2.txt', 'Esse é o conteúdo anexado.', function(err){
    if (err) throw err;
    console.log('Atualizado!')
})

E teremos nossa saída:

O método fs.writeFile() substitui o arquivo e conteúdo especificados:

let fs = require('fs');

// Especificamos o arquivo a ser atualizado
// e o novo conteúdo
fs.writeFile('meuNovoArquivo2.txt', 'Conteúdo atualizado', function (err){
    if (err) throw err;
    console.log('Salvo!')
})

E a nossa saída será:

Delete:

Para excluirmos um arquivo com o file system, podemos utilizar o método fs.unlink(). Veja na prática:

let fs = require('fs');

// Especificamos o nome e extensão do arquivo a ser deletado
fs.unlink('meuNovoArquivo.txt', function (err){
    if (err) throw err;
    console.log('Arquivo deletado!');
})

E pronto! O arquivo “meuNovoArquivo.txt” foi deletado!

Renomear:

Podemos utilizar o método fs.rename() para renomear um arquivo:

let fs = require('fs');

// Especificaremos o arquivo a ser renomeado
// e o novo nome
fs.rename('meuNovoArquivo2.txt', 'arquivoRenomeado.txt', function(err){
    if (err) throw err;
    console.log('Arquivo renomeado!');
})

E teremos:

E assim, terminamos os artigos obre o File System do Node.js!

Gostou? Comente abaixo!