Você sabia que existe uma biblioteca no NPM, que gera projetos em Node para a criação de APIs, a partir de um boilerplate com conexão a banco de dados e pré-configuração de envio de emails?
Estou falando da: lg-cli-tool
Essa biblioteca é uma belezinha (e não é só porque fui eu que fiz que eu to dizendo isso)
Na documentação dela (muito bem escrita aliás), você pode encontrar o comando para instalar e usa-lá:
$ npm i -g lg-cli-tool
Após instalar, para usar basta abrir o terminal e executar:
$ lg-cli-tool init
Ao rodar o comando acima, a biblioteca irá te fazer algumas perguntas sobre o seu projeto, como:
- Nome do projeto
- Precisa iniciar um repositório no GIT?
- O seu projeto node vai ter conexão com banco de dados?
- O seu projeto vai enviar emails?
E claro, se você responder que sim na questão sobre conexão com banco de dados, a biblioteca também irá perguntar sobre:
- Nome do banco
- Host do banco
- User do banco
- Senha do banco
- Porta do banco
Tudo isso com uma interface na linha de comando que nem parece que você está usando realmente uma linha de comando, isso graças a outra biblioteca chamada inquirer, que possui muitas ferramentas interessantes para a criação das perguntas.
Após responder todas essas questões com honestidade, a biblioteca clonará o boilerplate (adivinha quem fez ele também) que tem como base para a criação do projeto as libs: Express e TypeORM
-
Nós utilizamos o Express para a criação do nosso servidor http e gerenciamento dos endpoints da nossa API
-
O TypeORM utilizamos para fazer um melhor gerenciamento das consultas com o nosso banco de dados.
Se você já trabalhou em um projeto sem um ORM sabe como é a dor de cabeça de ter que montar toda hora uma query diferente, escrevendo comando por comando e tendo a chance de criar vários bugs por faltas de vírgula, ou até mesmo o excesso delas. O TypeORM vem acabar com esse problema pra gente e é usado como nosso principal ORM, tanto pela compatibilidade que ele tem com o TypeScript (que se você não usa ainda tá é perdendo tempo) quanto também pelo fato de ser muito mais simples que o Sequelize (minha opinião) que é outro ORM bem conhecido também.
Utilizamos o TypeORM junto com outra biblioteca que, ao meu ver, tornaria o uso dele um pouco inviável, ou um pouco mais dificil se ela não existisse, eu estou falando da typeorm-model-generator. O nome dela explica bem o que ela é, mas resumindo, é uma linha de comando que ao passar os parâmetros necessários para a conexão com banco de dados gera pra gente todos os arquivos de entidades das tabelas do banco, em C# se não me engano é o que chamam de DTO, que não são nada mais do que classes que espelham em suas propriedades exatamente a mesma tipagem das tabelas que estão no banco. As entidades ja vêm construidas com os Decorators que identificam o tipo da coluna na tabela (int, char, etc…), identificam também se a coluna é uma Primary Key e o P-R-I-N-C-I-P-A-L, ela identifica e cria pra gente as relacões de chaves estrangeiras que as tabelas possuem. Digo que isso é o principal pois no TypeORM é extremamente chato e confuso criar essas chaves estrangeiras nas entidades, pois elas precisam também de relações contrárias e eu nunca entendo muito bem o código então tem que ficar lendo a documentação toda vez que vai fazer isso, mas enfim… com a typeorm-model-generator nós não temos mais esse problema.
Falando em Decorators, o boilerplate também possui alguns de minha autoria para facilitar o seu uso ao criar rotas (por enquanto eles só fazem isso mesmo, mas pretendo adicionar outros no futuro). Quem já usou Spring em Java, ou já usou o NestJs em Node está acostumado com Decorators em cima dos métodos das controllers para identificar qual é a rota do mesmo, mas no Express nós não temos isso por padrão da lib, então com um pouco de pesquisa eu criei alguns com os principais métodos utilizados (GET, POST, DELETE).
Usamos da seguinte forma:
@Get('/users')
async all() {
return await this.defaultRepository.find()
}
A lg-cli-tool por padrão já faz a instalação das dependências pra gente utilizando o yarn e já abre o vs-code ao final da geração do projeto. O .env também é criado com as credenciais do banco então a única coisa que você precisa fazer no final do processo é iniciar a API com o comando:
yarn dev
Se der algum erro sobre “Certificate” e você escolheu o SQL Server, pode ser que tenha que acrescentar na connection.ts algumas configurações com relação a segurança do banco. Tente acrescentando as seguintes opções na const AppDataSource em connection.ts:
extra: {
trustServerCertificate: true,
},
options: {
encrypt: false
}
Então ela deverá ficar assim:
export const AppDataSource = new DataSource({
type: 'mssql',
port: Number(<number><unknown>process.env.DB_PORT),
host: <string>process.env.DB_HOST,
username: <string>process.env.DB_USER,
password: <string>process.env.DB_PASSWORD,
database: <string>process.env.DB_NAME,
synchronize: false,
entities: [...Tables],
extra: {
trustServerCertificate: true,
},
options: {
encrypt: false
}
})
Outras dicas importantes:
- A porta padrão da API é a 3333 mas você pode alterar essa configuração no .env também;
- Sempre ao editar uma tabela no banco de dados utilize a typeorm-model-generator para gerar novamente as entidades e atualiza-lás no seu projeto também;
- Se você não possui um padrão de pastas em seus projetos, recomendo seguir o padrão do boilerplate, irá te ajudar a organizar melhor as controllers e entidades;
- O boilerplate já vem com o ESlint configurado, se pretende adquirir boas práticas de programação recomendo que não desative-o;
- Se você gostar do boilerplate, dá uma estrelinha no repositório e apoie a comunidade de código aberto :)
Achou algum erro ou quer entrar em contato? Por favor, me envie um email em: luisgustavofeitoza@gmail.com.