Criando conexão com MySQL + TypeScript e utilizando minha API REST para fazer as quatro operações básicas de manipulação de dados. Aprenda a conectar seu MySQL e fique a vontade para estudar o código
licença e tecnologias utilizadas:
Tabela de Conteúdos
---
title: Estrutura de pastas
---
flowchart LR
crud("📁 _CRUD_MySQL_")@{ shape: processes }
crud --o build("📁 _build_")@{ shape: processes }
crud ---o src("📁 _src_")@{ shape: processes }
src --o config("📁 _config_")@{ shape: processes }
config --- db.ts("📄 **db.ts**")@{ shape: card }
src --o controllers("📁 _controllers_")@{ shape: processes }
controllers --- UserController.ts("📄 **UserController.ts**")@{ shape: card }
src --o models("📁 _models_")@{ shape: processes }
models --- UserModel.ts("📄 **UserModel.ts**")@{ shape: card }
src --o routes("📁 _routes_")@{ shape: processes }
routes --- Users.ts("📄 **Users.ts**")@{ shape: card }
src --- app.ts("📄 **app.ts**")@{ shape: card }
src --- server.ts("📄 **server.ts**")@{ shape: card }
env("⚙️ .env")
%%CLASSES
classDef default fill:#191919,color:white;
classDef pasta fill:#403211,stroke:#c99e34,stroke-width:2px,color:#fff1cc;
classDef envStyle fill:#000000,stroke:#000000,color:gray;
%%aplicação de classes
class crud,src,config,controllers,models,routes,build pasta
class env envStyle
%%LINKS
%%pastas
linkStyle 0,1,3,5,7 stroke:#f2c04b
%%arquivos
linkStyle default stroke-width:2px;
click build "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/build"
click src "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src"
click config "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/config"
click db.ts "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/config/db.ts"
click controllers "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/controllers"
click UserController.ts "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/controllers/UserController.ts"
click models "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/models"
click UserModel.ts "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/models/UserModel.ts"
click routes "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/routes"
click Users.ts "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/routes/Users.ts"
click app.ts "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/app.ts"
click server.ts "https://github.com/henrygoncalvess/CRUD_MySQL/tree/main/src/server.ts"
- MySQL - Tutorial de instalação
Para a instalação dos frameworks, middlewares e dependências que possibilitaram a criação da API
e a conexão com o MySQL é necessário que você possua as seguintes ferramentas:
-
Node.js - Tutorial de instalação
-
npm - Tutorial de instalação
-
TypeScript - Tutorial de instalação
Para fazer requisições e testar a conexão com o banco:
- Postman - Tutorial de instalação
Tip
Também é possível fazer requisições pela linha de comando.
Clique aqui para aprender a fazer requisições pelo terminal
No Terminal, certifique de que você está na pasta onde vai ficar o repositório
repositorios\clonados
git clone https://github.com/henrygoncalvess/CRUD_MySQL.git
repositorios\clonados\CRUD_MySQL
npm init
repositorios\clonados\CRUD_MySQL\package.json
"scripts": {
"dev": "ts-node-dev --inspect --transpile-only --ignore-watch node_modules src/server.ts",
"start": "node build/server.js",
"build": "tsc"
}
repositorios\clonados\CRUD_MySQL
npm install cors@2.8.5 mysql2@3.11.3 dotenv@16.4.5 express@4.21.1
npm install --save-dev typescript@5.7.2 @types/node @types/express @types/cors ts-node
repositorios\clonados\CRUD_MySQL
npx tsc --init
este padrão de arquivo typescript está de acordo com esta documentação
baseado na versão node utilizada
repositorios\clonados\CRUD_MySQL\tsconfig.json
{
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Node 22",
"_version": "22.0.0",
"compilerOptions": {
"lib": ["es2023"],
"module": "node16",
"target": "es2022",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"moduleResolution": "node16",
"rootDirs": ["./src"],
"outDir": "./build",
"removeComments": true,
"forceConsistentCasingInFileNames": true,
}
}
6. crie o arquivo .env
na raiz do projeto - repositorios\clonados\CRUD_MySQL
, e configure as variáveis de acordo com seus dados do MySQL.
HOST=seu_host #exemplo: localhost
USER=seu_usuario #exemplo: root
PASSWORD=sua_senha
DB=nome_do_seu_database
TABLE=sua_tabela
repositorios\clonados\CRUD_MySQL
npm run build
Inicie o servidor local e veja Endpoints do CRUD para testar as respostas do banco
repositorios\clonados\CRUD_MySQL
npm run start
No Postman ou na linha de comando
teste as respostas da conexão com o MySQL seguindo os endpoints abaixo.
Tip
acesse este link, caso não saiba utilizar o Postman para fazer requisições Postman
acesse este link, caso não saiba fazer requisições pela linha de comando Clique aqui
Rota | Descrição |
---|---|
GET http://localhost:3000/api/user |
Lista todas as informações da tabela - ver JSON |
POST http://localhost:3000/api/new/user |
Adiciona um novo item na tabela - ver JSON |
PUT http://localhost:3000/api/update/user |
Atualiza as informações da tabela - ver JSON |
DELETE http://localhost:3000/api/delete/user |
Deleta uma linha da tabela - ver JSON |
+------------+---------------+------+---------+ +-----------+------------+------+------+
| Field | Type | Null | Default | | nome | nascimento | sexo | peso |
+------------+---------------+------+---------+ +-----------+------------+------+------+
| nome | varchar(30) | NO | NULL | | Miguel | 2004-10-29 | M | 55.3 |
| nascimento | date | NO | NULL | | Pedro | 2001-02-04 | M | 80.9 |
| sexo | enum('M','F') | NO | NULL | | Valentina | 1989-04-07 | F | 62.1 |
| peso | float | YES | NULL | +-----------+------------+------+------+
+------------+---------------+------+---------+
[
{
"nome": "Pedro",
"nascimento": "2000-01-04T02:00:00.000Z",
"sexo": "M",
"peso": 80
},
{
"nome": "Valentina",
"nascimento": "1989-04-07T03:00:00.000Z",
"sexo": "F",
"peso": 62.1
}
]
nome, nascimento e sexo são obrigatórios
{
"nome": "novo usuario",
"nascimento": "2021-11-01",
"sexo": "M"
}
Response
{
"fieldCount": 0,
"affectedRows": 1,
"insertId": 0,
"info": "",
"serverStatus": 2,
"warningStatus": 0,
"changedRows": 0
}
linha atual
+-------+------------+
| nome | nascimento |
+-------+------------+
| Pedro | 2001-02-04 |
+-------+------------+
Request
"usuario"
: parâmetro para localizar a linha que será alterada.
informar apenas os parâmetros a serem alterados
{
"usuario": "Pedro",
"nascimento": "1999-09-09"
}
Response
{
"fieldCount": 0,
"affectedRows": 1,
"insertId": 0,
"info": "Rows matched: 1 Changed: 1 Warnings: 0",
"serverStatus": 34,
"warningStatus": 0,
"changedRows": 1
}
linha alterada
+-------+------------+
| nome | nascimento |
+-------+------------+
| Pedro | 1999-09-09 |
+-------+------------+
linha atual
+--------------+------------+------+------+
| nome | nascimento | sexo | peso |
+--------------+------------+------+------+
| Miguel | 2004-10-29 | M | 55.3 |
| Pedro | 1999-09-09 | M | 80.9 |
| Valentina | 1989-04-07 | F | 62.1 |
| novo usuario | 2021-11-01 | M | 66.4 |
+--------------+------------+------+------+
Request
"usuario"
: parâmetro para localizar a linha que será deletada
{
"usuario": "novo usuario"
}
Response
[
{
"fieldCount": 0,
"affectedRows": 1,
"insertId": 0,
"info": "",
"serverStatus": 34,
"warningStatus": 0,
"changedRows": 0
},
null
]
linha alterada
+-----------+------------+------+------+
| nome | nascimento | sexo | peso |
+-----------+------------+------+------+
| Miguel | 2004-10-29 | M | 55.3 |
| Pedro | 1999-09-09 | M | 80.9 |
| Valentina | 1989-04-07 | F | 62.1 |
+-----------+------------+------+------+