Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
November 14, 2022 02:42 pm GMT

Construindo aplicao do zero com node.js: Parte 4

Depois de desenvolver toda a regra principal da aplicao, vamos comear a implementar de fato as nossas dependncias.

Mo na massa

Primeiramente vamos alterar o arquivo .env, que foi criado l parte 2, deixe o arquivo com as seguintes informaes:

APP_PORT=8001DB_DIALECT=postgresDB_HOST=db_two_factorDB_DATABASE=two_factorDB_USER=rootDB_PASSWORD=rootJWT_SECRET=My@jwt#Secret%EMAIL_HOST=smtp.gmail.comEMAIL_USER=email_de_exemplo@gmail.comEMAIL_PASS=sua_senhaEMAIL_PORT=465

Essas so todas as credenciais necessrias nesse projeto. Recomendo parar e subir os containers novamente, depois, acesse o terminal do servio node para que possamos instalar nossas bibliotecas.

Outro detalhe que os dados acima so somente de exemplo, se voc tem uma conta do google, assim como eu, altere somente os campos EMAIL_USER e EMAIL_PASS, agora caso queiram utilizar algo diferente, necessrio alterar o EMAIL_HOST e talvez o EMAIL_POST.

Dependncias

A primeira dependncia que vamos instalar, uma biblioteca que far o carregamento das informaes contidas no arquivo .env, no terminal, execute o comando abaixo para fazer a instalao:

npm i dotenv

Aps isso, crie um arquivo chamado load-env.js dentro de src/infra/env. Nesse arquivo vamos implementar a lgica para que ele consiga ler as informaes do nosso arquivo .env. Adicione o cdigo abaixo no arquivo:

import { config } from 'dotenv';const loadEnv = async () => {    let env = '';    if (process.env.NODE_ENV) {        env = `.${process.env.NODE_ENV}`;    }    const configPath = `.env${env}`;    const result = config({        path: configPath    });    if (result.error) {        throw result.error    }}export default loadEnv;

Agora, na raiz da nossa aplicao, crie um arquivo chamado index.js com o seguinte contedo:

import loadEnv from './src/infra/env/load-env.js';async function run() {    await loadEnv();}run();

Esse arquivo ser o ponto de partida da nossa aplicao. Por enquanto deixemos ele assim, voltaremos a modific-lo no futuro.

Em seguida, vamos instalar uma biblioteca para manipular senhas, ela ser til por exemplo para criptografar senhas e fazer comparaes de hashs:

npm i bcrypt

Agora crie um arquivo chamado password-hash.js, dentro de src/infra/hash, com o contedo abaixo:

import IPasswordHash from './../../domain/ipassword-hash.js';import Bcrypt from 'bcrypt';import { promisify } from 'util';const compareAsync = promisify(Bcrypt.compare);export default class PasswordHash extends IPasswordHash {    constructor() {        super();    }    compare(password, hash) {        return compareAsync(password, hash);    }}

Basicamente implementamos nosso comparativo de senha, detalhe para o uso da funo interna do node chamada promisify, que converte funes callback para promise, facilitando o use de qualquer recurso.

Agora vamos instalar duas bibliotecas muito teis, a primeira vai servir para gerar um token jwt, e o segundo nos servir para gerar uuids:

npm i jsonwebtoken short-uuid

Aps a instalao, vamos comear por configurar a nossa gerao de token jwt. Dentro de src/infra/jwt, crie o arquivo jwt.js, com o seguinte contedo:

import IToken from './../../domain/itoken.js';import JWT from 'jsonwebtoken';export default class Jwt extends IToken {    constructor() {        super();    }    generateWebToken(user) {        const token = JWT.sign({            id: user.id,            email: user.email,        }, process.env.JWT_SECRET);        return token;    }}

Aqui no tenho muito o que falar a no ser recomendar pesquisarem um pouco sobre essa biblioteca para terem noo do quo poderosa ela .

Agora vamos configurar nosso gerador de uuids, dentro de src/infra/token, crie o arquivo token-service.js, e insira o contedo abaixo:

import Short from 'short-uuid';import IGenerateToken from '../../domain/igenerate-token.js';export default class TokenService extends IGenerateToken {    constructor() {        super();    }    getToken() {        return Short.uuid();    }    getEmailToken() {        return Short.generate();    }}

Essa biblioteca vai nos fornecer dois recursos: o primeiro a gerao de um uuid completo, algo como fd5c084c-ff7c-4651-9a52-37096242d81c, alm disso, ela tambm permite a gerao de identificadores menores, ento o mtodo generate() retornaria algo parecido com isso mhvXdrZT4jP5T8vBxuvm75.

Agora vamos instalar a biblioteca que vai fazer o envio de e-mail:

npm i nodemailer

Aps a instalao, vamos configurar nosso servio de e-mail, dentro do diretrio src/infra/email, crie um arquivo chamado body-email-html.js, ele vai conter o contedo html que ser enviado para o cliente:

const bodyEmailHtml = (token) => {    return `<!DOCTYPE html>        <html>        <head>        <style>            .container {                margin: 10% 20%;                border-radius: 10px;                background-color: white;            }            .title {                padding: 1% 0% 0%;                text-align: center            }            p {                color:blue;                text-align: center;                font-family: Arial, sans-serif;                font-size: 30px;                padding-bottom: 5%;            }        </style>        </head>        <body>            <div class="container">                <div class="title">                    <h3>Use the token below to finish login.</h3>                </div>                <hr/>                <p>${token}</p>            </div>        </body>        </html>`;};export default bodyEmailHtml;

Ainda dentro do mesmo diretrio, crie um arquivo chamado email.js, nele vamos realmente implementar a funcionalidade de envio:

import IEmail from './../../domain/iemail.js';import nodemailer from "nodemailer";import bodyEmailHtml from './body-email-html.js';export default class Email extends IEmail {    constructor() {        super();    }    async send(user) {        const transporter = nodemailer.createTransport({            host: process.env.EMAIL_HOST,            port: process.env.EMAIL_PORT,            auth: {                user: process.env.EMAIL_USER,                pass: process.env.EMAIL_PASS,            },        });        await transporter.sendMail({            from: process.env.EMAIL_USER,            to: user.email,            subject: "Hello, see you token",            html: bodyEmailHtml(user.emailToken)        });    }}

Como podem ver, no tem nada de complexo, basicamente informamos a configurao de conexo, e aps isso enviamos o e-mail para o remetente correto. Outra recomendao olhar mais detalhadamente essa biblioteca para ter uma noo dos inmeros outros recursos que ela oferece.

Bem pessoal, a partir de agora faremos algumas instalaes bem teis, porm s vamos configur-las no prximo artigo. Vamos comear pelo hapi, que far todo o intermdio entre as requisies web e a nossa aplicao:

npm i @hapi/boom @hapi/hapi @hapi/inert @hapi/vision hapi-swagger joi

Muitos devem conhecer o express ou outra lib que faa a mesma coisa, caso queira utilizar algo diferente do hapi, fiquem a vontade.

Em seguida, vamos instalar um orm, que vai servir para intermediar nossa comunicao e manipulao do banco, eu optei pelo sequelize, mas fique a vontade se quiser utilizar outro:

npm i pg pg-hstore sequelize

E por ltimo, mas no menos importante, vamos instalar uma lib, que bem til enquanto voc desenvolve.

npm i --save-dev nodemon

O nodemon bem til enquanto desenvolvemos, pois no precisaremos reiniciar o servidor a cada alterao. Para vocs que esto seguindo esses artigos, no ser to til, devido eu ter feito de uma forma mais organizada, mas para mim que fazia o projeto e no segui exatamente a ordem dos artigos, ajudou bastante.

Outro ponto que essa biblioteca, assim como a de teste, vai ser instalada somente para ambiente de desenvolvimento.

Resumo

Neste artigo, vimos a instalao e uso de algumas dependncias, recomendo novamente que pesquisem um pouco mais sobre cada biblioteca instalada, seus recursos, etc.

Se voc for um dev mais experiente, e conhea ou queira utilizar outras bibliotecas, deixei claro que voc pode fazer isso tranquilamente. Repare que essas mudanas no afetam a nossa lgica principal, esse um benefcio de adotar uma arquitetura que tenha como foco a camada de regras de negcio. At o prximo artigo.


Original Link: https://dev.to/erandirjunior/construindo-aplicacao-do-zero-com-nodejs-parte-4-3h8m

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To