Introdução ao trabalho com bancos de dados em TypeScript
TypeScript é uma extensão estritamente tipada do JavaScript que adiciona tipagem estática e recursos modernos da linguagem. Ao desenvolver aplicações server-side em TypeScript, frequentemente surge a necessidade de interagir com bancos de dados. Duas das soluções mais populares são o SGBD relacional PostgreSQL e o MongoDB orientado a documentos. Neste artigo, veremos como trabalhar eficientemente com ambos os bancos de dados em TypeScript, utilizando bibliotecas comprovadas e melhores práticas.
Configuração do ambiente e instalação de dependências
Antes de começar, certifique-se de ter Node.js e npm instalados. Crie um novo projeto e instale os pacotes necessários:
mkdir typescript-db-examplecd typescript-db-examplenpm init -ynpm install typescript ts-node @types/node --save-devnpx tsc --initPara trabalhar com PostgreSQL, usaremos TypeORM — um ORM poderoso com suporte a TypeScript. Para MongoDB, usaremos Mongoose.
npm install typeorm reflect-metadata pgnpm install mongooseTrabalhando com PostgreSQL via TypeORM
Configuração da conexão com PostgreSQL
TypeORM suporta decorators e active record. Vamos criar o arquivo data-source.ts para configuração:
import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "your_username", password: "your_password", database: "test_db", synchronize: true, logging: false, entities: ["src/entity/**/*.ts"], migrations: [], subscribers: [],});Criação de entidade (Entity)
Vamos definir um modelo de usuário usando decorators:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() firstName: string;
@Column() lastName: string;
@Column({ unique: true }) email: string;
@Column({ default: true }) isActive: boolean;}Operações CRUD com PostgreSQL
Vamos realizar as operações básicas com o banco de dados:
import { AppDataSource } from "./data-source";import { User } from "./entity/User";
async function main() { await AppDataSource.initialize(); const userRepository = AppDataSource.getRepository(User);
// CREATE const newUser = userRepository.create({ firstName: "Ivan", lastName: "Petrov", email: "ivan@example.com" }); await userRepository.save(newUser);
// READ const users = await userRepository.find(); console.log("Todos os usuários:", users);
// UPDATE const userToUpdate = await userRepository.findOneBy({ id: 1 }); if (userToUpdate) { userToUpdate.isActive = false; await userRepository.save(userToUpdate); }
// DELETE await userRepository.delete({ id: 1 });}
main().catch(console.error);Trabalhando com MongoDB via Mongoose
Conexão ao MongoDB
Mongoose fornece schema e validação convenientes para MongoDB. Vamos configurar a conexão:
import mongoose, { Schema, Document, Model } from "mongoose";
const MONGO_URI = "mongodb://localhost:27017/test";
mongoose.connect(MONGO_URI) .then(() => console.log("Conectado ao MongoDB")) .catch(err => console.error("Erro de conexão:", err));Definição de schema e modelo
Vamos criar uma interface para TypeScript e um schema Mongoose:
// Interface para TypeScriptinterface IUser extends Document { firstName: string; lastName: string; email: string; createdAt: Date;}
// Schema Mongooseconst userSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: { type: String, required: true }, createdAt: { type: Date, default: Date.now }});