Einleitung: Warum TypeScript und Datenbanken ein ideales Paar sind
Moderne Webentwicklung ist ohne die Arbeit mit Datenbanken (DB) undenkbar. TypeScript, als streng typisierte Erweiterung von JavaScript, bietet Entwicklern ein leistungsstarkes Werkzeug zur Erstellung zuverlässiger und skalierbarer Anwendungen. In diesem Artikel werden wir praktisch erarbeiten, wie man die beiden beliebtesten Datenbanken – die relationale PostgreSQL und die dokumentenorientierte MongoDB – in der TypeScript-Ökosystem einbindet und nutzt.
Sie erfahren, wie Sie ORM/ODM einrichten, typisierte Modelle schreiben und grundlegende CRUD-Operationen durchführen. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen von TypeScript und Node.js vertraut sind.
1. Projekteinrichtung und Installation der Abhängigkeiten
Bevor wir Code schreiben, erstellen wir ein neues Projekt und installieren die erforderlichen Pakete. Für die Arbeit mit PostgreSQL verwenden wir TypeORM – eines der beliebtesten ORMs für TypeScript. Für MongoDB verwenden wir Mongoose.
Projektinitialisierung
mkdir typescript-db-practicecd typescript-db-practicenpm init -ynpm install typescript ts-node @types/node --save-devnpx tsc --initInstallation der Abhängigkeiten für PostgreSQL
npm install typeorm reflect-metadata pgnpm install @types/node --save-devInstallation der Abhängigkeiten für MongoDB
npm install mongoosenpm install @types/mongoose --save-devNach der Installation müssen Sie in der Datei tsconfig.json unbedingt die Optionen "experimentalDecorators": true und "emitDecoratorMetadata": true aktivieren – diese werden für die Arbeit mit TypeORM benötigt.
2. Arbeiten mit PostgreSQL über TypeORM
TypeORM unterstützt sowohl Active Record- als auch Data Mapper-Muster. Wir betrachten Data Mapper, da es mehr Flexibilität bietet und besser mit einer sauberen Architektur harmoniert.
Erstellen einer Entität (Entity)
Wir erstellen ein Benutzermodell. Jede Entität ist eine Klasse, die mit speziellen Annotationen dekoriert ist.
// src/entities/User.tsimport { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ length: 100 }) name: string;
@Column({ unique: true }) email: string;
@Column({ select: false }) password: string;
@CreateDateColumn() createdAt: Date;}Einrichtung der Verbindung und des Repositorys
Wir erstellen eine Datei zur Initialisierung der Datenbank und ein Repository für die Arbeit mit Benutzern.
// src/data-source.tsimport "reflect-metadata";import { DataSource } from "typeorm";import { User } from "./entities/User";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "postgres", password: "password", database: "test_db", synchronize: true, // Automatische Tabellenerstellung (nur für die Entwicklung!) logging: false, entities: [User], migrations: [], subscribers: [],});// src/repositories/userRepository.tsimport { AppDataSource } from "../data-source";import { User } from "../entities/User";
export const userRepository = AppDataSource.getRepository(User);CRUD-Operationen in der Praxis
// src/index.tsimport { AppDataSource } from "./data-source";import { userRepository } from "./repositories/userRepository";
async function main() { await AppDataSource.initialize(); console.log("PostgreSQL connected!");
// CREATE const newUser = userRepository.create({ name: "Ivan Petrov", email: "ivan@example.com", password: "hashed_password" }); await userRepository.save(newUser); console.log("User created:", newUser);
// READ const us