Meu Setup para API's Node.js
Meu Setup para criar uma api node.js
Existem diversos vídeos e tutoriais ensinando a criar uma api com Node.js, mas se tem uma coisa que nenhuma delas tem em comum é o Setup. Não adianta, podemos utilizar os mesmos frameworks, as mesmas bibliotecas, mas cada vez que iremos iniciar um projeto do zero faremos de uma maneira diferente.
Hoje eu trago pra vocês como eu faço o setup das minhas api's Node.js com Typescript, Prisma e Swagger
O inicio
O Node.js é tão versátil que nem o início é padronizado, dá pra começar de vários jeitos, sério! 😮
Eu faço criando um repositório no github e fazendo o clone dela, gosto assim porque não tenho que me preoculpar com .gitignore nem nada do tipo, mas o principal aqui para começar é ter uma pasta para o projeto.
Depois que eu já tenho a pasta eu a abro no VS Code e uso o terminal de dentro do editor.
Vamos lá, COMANDOS!
- npm init
Sim, eu uso o npm, já tive muitos problemas com o Yarn, eu sei que é mais rápido, mas ainda prefiro o npm, principalmente no backend.
E sim, eu faço os input dos dados linha a linha, nada de npm init -y 🤗
Typescript
- npx tsc --init
- npm i typescript tsx -D
Ultimamente tenho utilizado o tsx pra rodar meu servidor typescript mas já utilizei muito o ts-node-dev
Repararam que eu uso -D ao invés de --save-dev? herdei isso do yarn, funciona.
Agora o meu tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["ESNext"],
"sourceMap": true,
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
É isso :)
Express e servidor
Mais comandos:
- npm i express dotenv cors
- npm i @types/node @types/express @types/cors -D
Agora vamos para um pouquinho de código, mas antes vamos criar a famosa pastinha src.
Dentro de src eu crio um arquivo app.ts
E meu arquivo app.ts fica assim:
import cors from "cors";
import express, { Express } from "express";
export const createApp = async (): Promise<Express> => {
const app = express();
app.use(express.json());
app.use(cors());
return app;
};
É sempre bom deixar o arquivo que dá o start na aplicação (nesse caso meu index.ts) bem clean, por isso separo (app.ts e index.ts) o que geralmente é feito em um único arquivo só.
E meu arquivo index.ts fica assim:
import { config } from "dotenv";
import { createServer } from "http";
import { createApp } from "./app";
config();
const port = process.env.PORT || 3000;
const start = async () => {
const app = await createApp();
const server = createServer(app);
server.listen(port, () => {
console.log("Server listening on port:", port);
});
};
start();
Com isso aqui já estamos prontos pra sair codando e criar uma api, mas eu prometi mostrar mais coisas
Swagger
Uma api PRECISA de um documento, eu falo isso agora, mas eu já criei muita api sem documento nenhum, só depois que eu tive que refatorar uma api sem documentação que tinha quase 200 endpoints (sim, acredite!) eu passei a valorizar o querido Swagger. Então vamos voltar pros comandos!
- npm i yamljs swagger-ui-express
Eu crio um arquivo, geralmente chamado openapi.yaml na pasta raiz, configuro ele todo usando o padrão Open Api 3.0 (https://editor.swagger.io/) e importo ele no app.ts
finalmente meu app.ts fica assim:
import cors from "cors";
import express, { Express } from "express";
import swaggerUI from "swagger-ui-express";
import yaml from "yamljs";
export const createApp = async (): Promise<Express> => {
const app = express();
app.use(express.json());
app.use(cors());
const swaggerDocument = yaml.load("./openapi.yaml");
app.use("/", swaggerUI.serve, swaggerUI.setup(swaggerDocument));
return app;
};
Agora temos na rota / da nossa api a documentação necessária.
Vamos falar de banco de dados?
Prisma
Se você usa Node.js + Typescript você precisa conhecer o Prisma, já usei Sequelize, TypeORM, mas o prisma deixa tudo muito mais fácil, começando pelo setup
- npm i prisma -D
- npx prisma init --datasource-provider sqlite
Nesse caso vou mostrar usando o sqlite, mas geralmente eu uso com Postgres
Depois desse ultimo comando será gerado uma pasta chamada prisma, onde irá conter as nossas migrations e o schema do nosso banco
Eu edito o schema.prisma inserindo as tabelas que eu quero no banco e dou meu migrate
(saiba mais em: https://www.prisma.io/migrate)
- npx prisma migrate dev --name init
Agora é só criar nossos Controllers e trabalhar com o Prisma, mas isso eu vou deixar para um próximo post ;)
Bônus: prisma-erd-generator
Que tal gerar um Diagrama entidade relacionamento automaticamente a cada migrate? Maneiro né?!
- npm i -D prisma-erd-generator @mermaid-js/mermaid-cli
Agora basta adicionar o seguinte código no schema.prisma
generator erd { provider = "prisma-erd-generator" }
E pronto, a cada migrate ou npx prisma generate será gerado um svg do seu diagrama.
E aí, o que acharam?
Vocês fazem diferente?
Me conta aqui nos comentários :)