JSagon NodeJS Framework

Construa aplicações eficientes e escaláveis de maneira simples e rápida.


Database

A JSagon está em pleno desenvolvimento de adapters que permitem uma fácil integração com outras tecnologias e ferramentas de terceiros. Porém, é completamente viável fazer uma implementação paralela enquanto determinado adapter ainda não esteja disponível para implementação e deploy para produção.

Este artigo tem como propósito demonstrar uma breve e simples integração com Banco de dados utilizando o Mongoose (MongoDB) e a JSagon Framework. O mesmo esquema e estrutura seria aplicável a qualquer outro banco e ferramenta utilizada, dentre eles Sequilize e TypeORM. Entendido o conceito, a aplicação se torna ampla.

Considerando que o projeto já esteja criado, partiremos de fato para a implementação. A instalação do MongoDB é um requisito para que a implementação funcione corretamente, faça então o download e instale-o de acordo com o seu sistema operacional.

Para realizar a conexão com o banco de dados, utilizaremos o Mongoose. Mongoose é uma biblioteca para NodeJS que fornece soluções que facilitam o manuseio do banco de dados, baseando-se em esquemas para modelar os dados da aplicação. Execute o seguinte código para instalá-lo em sua aplicação:

npm i mongoose

O próximo passo é inicializar o banco de dados junto a aplicação para um uso efetivo. Para isso, crie uma pasta de nome "database" na configuração da aplicação e crie também um arquivo de nome mongodb.ts, o caminho ficará dev/src/config/database/mongodb.ts. No arquivo, inserida o seguinte código:

    import mongoose from 'mongoose'
    
    mongoose.connect('mongodb://127.0.0.1:27017/website-db', {
        useCreateIndex: true,
        useNewUrlParser: true,
        useUnifiedTopology: true
    }).catch( error => {
        console.log('Não foi possível se conectar ao MongoDB', error)
    })

No código anterior, o mongoose estabelece uma conexão com o banco de dados MongoDB. A string de conexão segue uma configuração padrão local do MongoDB. O "website-db" é o nome interno do banco a ser utilizado.

Para inicializar a conexão com o banco de dados junto a aplicação, importe o arquivo criado na configuração base como a seguir em dev/src/config/app.config.ts:

    // ...
    import './database/mongodb'
    // ...

Para confirmar que tudo está funcionando corretamente, inicialize a aplicação como a seguir:

    npm run dev

Caso a mensagem de erro definida no catch da conexão não apareça, significa que a conexão foi estabelecida.

Implementação

A implementação de exemplo será um simples cadastro de contato no banco de dados, referente aquela área do site onde as pessoas mandam perguntas, dúvidas, etc. A estrutura de pastas e nomes seguem a convenção padrão de quando se cria um projeto novo do zero. Vamos lá.

Todo o desenvolvimento e estrutura foi pensado de forma a uma melhor organização do projeto, e escalabilidade futura.

Crie uma pasta Models no módulo Base do app Website. E crie também um arquivo de nome Contato.ts. O caminho então ficaria dev/src/app/Website/modules/Base/Models/Contato.ts. No arquivo, insira o seguinte código.

    import mongoose from 'mongoose'
    
    const contatoSchema = new mongoose.Schema({
        nome: {
            type: String,
            required: [true, 'Nome obrigatório'],
            trim: true
        },
        email: {
            type: String,
            required: [true, 'E-mail obrigatório'],
            trim:true,
            lowercase:true
        },
        message: {
            type: String,
            equired: [true, 'Mensagem obrigatória'],
        },
    }, {
        timestamps: true
    })
    
    const Contato = mongoose.model('Contato', contatoSchema)
    
    export default Contato

Como este é um tutorial de integração, não será aprofundado o funcionamento dos recursos do mongoose.

Visando centralizar o manuseio do model Contato, criaremos agora uma pasta Repository, e um arquivo de nome ContatoRepository. O caminho do arquivo ficará dev/src/app/Website/modules/Base/Repository/ContatoRepository.ts.

    import Contato from '../Models/Contato'
    
    class ContatoRepository {
        public static async register (nome: string, email: string, mensagem: string) {
            const contato = new Contato({nome, email, mensagem})
            await contato.save()
        }
    }
    
    export default ContatoRepository

No exemplo anterior importamos o model Contato, criamos uma classe para centralizar as suas operações, e criamos um método para registrar o contato em banco.

Agora por fim, em nosso controlador, HomeController, e action salvarContato, poderemos utilizar dessa estrutura para facilmente salvar os contatos. No arquivo dev/src/app/Website/modules/Base/Controller/HomeController.ts, realize as mudanças como a seguir:

    import { AbstractController, Request, Response } from '@jsagon/core'
    import ContatoRepository from '../Repository/ContatoRepository'
    
    class HomeController extends AbstractController {
    
        public async salvarContato(req: Request, res: Response) {
            const {nome, email, mensagem} = req.body
            await ContatoRepository.register(nome, email, mensagem)
            return res.json({msg: 'Contato registrado com sucesso'})
        }
    
    }
    
    export default HomeController

Considerações finais

O objetivo do artigo foi demonstrar que aproveitando-se da estrutura da framework pode-se além de integrar com outras ferramentas, organizar a aplicação de maneira a ter um melhor aproveitamento e escalabilidade. Este modelo pode se aplicar a qualquer outra biblioteca de banco de dados que deseje utilizar.

Qualquer dúvida, entre em contato por um dos meios disponíveis.