Friedrich Siever

10. Januar 2024

Nest.js mit TypeOrm und Postgresql

von: Friedrich Siever | Last Updated: 10.01.24

Die Arbeit mit zustandsbehafteten Daten und Datenbanken kann herausfordernd sein, insbesondere wenn dein Projekt mit der Zeit wächst. Ein solides Entwicklungs- und Projekt-Setup von Anfang an ist entscheidend für den Erfolg deines Entwicklungsprojekts. In diesem Beitrag möchte ich dir zeigen, wie ich meine Projekte aufsetze und die Überlegungen hinter dieser Konfiguration erläutern.

Wir werden uns in diesem Beitrag mit der Entwicklung einer einfachen NodeJS-API (mit Nest.js) beschäftigen, die von einer PostgreSQL-Datenbank für die Datenspeicherung angetrieben wird. Zudem werden wir einige Tools einrichten, um das Leben der Entwickler zu erleichtern.

Nachdem dein Nest.js-Projekt erfolgreich eingerichtet wurde, benötigst du einige Zusatzbibliotheken, um dein Entwicklerleben zu vereinfachen.

npm install --save @nestjs/typeorm typeorm pg

Diese Bibliotheken werden uns auf unserem Weg unterstützen.

Nun müssen wir die Moduldatei um die entsprechenden importe erweitern.

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: "postgres",
      host: "127.0.0.1",
      port: 5432,
      username: "YOUR-USERNAME",
      password: "YOUR-PASSWORD",
      database: "YOUR-DATABASE-NAME",
    }),
  ],
  controllers: [AppController, ExhibitionsController],
  providers: [AppService],
})
export class AppModule {}

Wenn du eine entsprechende Datenbank verfügbar hast und deinen Devserver neu startest, solltest du in den Konsolen-Logs folgende erfreuliche Nachricht vorfinden:

[Nest] 25796  - 01/10/2024, 3:17:01 PM     LOG [InstanceLoader] TypeOrmCoreModule dependencies initialized +33ms

Ich hoffe, dass alles reibungslos funktioniert hat, denn nun stehen großartige Entwicklungen bevor.

Entitäten, Primärschlüssel und Spalten.

Ein weiterer sinnvoller Schritt besteht darin, Entitäten mithilfe von TypeORM zu erstellen. Hierbei kommen uns die für Nest.js typischen Decorators zugute, die die Deklarationen zu einem Kinderspiel machen.

// src/exhibition.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity("exhibition")
export class Exhibition {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column("varchar", { options })
  city: string;

  @Column()
  starts: Date;

  @Column()
  ends: Date;
}

Grundsätzlich versucht TypeORM standardmäßig, die korrekten Typen für Datenbankspalten aus den Typen der Properties abzuleiten. Es ist jedoch auch möglich, dies manuell zu steuern. Dabei ist zu beachten, dass der gewählte Typ datenbankspezifisch sein muss. Die Syntax für die Spaltendefinition wird besonders bei der City-Spalte deutlich. Mithilfe des Optionsobjekts können verschiedene Eigenschaften definiert werden, darunter:

  • select?: boolean;
  • name?: string;
  • primary?: boolean;
  • generated?: boolean | "increment" | "uuid" | "rowid" | "identity";
  • unique?: boolean;
  • nullable?: boolean;
  • default?: any;
  • onUpdate?: string;
  • comment?: string;
  • array?: boolean;
  • transformer?: ValueTransformer | ValueTransformer[];

In den Entitäten können wir somit den Aufbau und die Eigenschaften unserer Datenbank direkt steuern.

Anschließend müssen wir unsere Entitäten im Modul registrieren. Für die lokale Entwicklung können wir zusätzlich die synchronize-Option setzen. Dieses Feature sollte mit Vorsicht eingesetzt werden, da es Migrationen erspart. Beachte jedoch, dass es Schaden anrichten kann, wenn es für alle Umgebungen (nicht nur in der Entwicklung) aktiviert ist.

// src/app.module.ts
// ...
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: '127.0.0.1',
      port: 5432,
      username: 'DeinPGUser',
      password: 'DeinPasswort',
      database: 'nest-js-exhibitions',
      entities: [Exhibition],
      synchronize: true,
    }),
  ],
  controllers: [AppController, ExhibitionsController],
  providers: [AppService],
})

Wenn du nun deinen Development Server startest, wirst du festellen, dass eine Tabelle mit den entsprechenden Feldern angelegt wurde.

nestjs response in insomnia

Erweiterte Lektüre

Fazit

Fazit Die Einrichtung einer Nest.js-Anwendung mit TypeORM und PostgreSQL ermöglicht eine effiziente und skalierbare Datenbankintegration. Die detaillierten Schritte zum Projekt- und Entwicklungs-Setup bieten einen soliden Rahmen für die Bewältigung zustandsbehafteter Daten in wachsenden Projekten. Die Verwendung von Nest.js-Decorators und die Konfiguration von TypeORM ermöglichen eine klare Strukturierung von Entitäten, Primärschlüsseln und Spalten in der Datenbank. Mit den richtigen Tools und Bibliotheken wird nicht nur die Entwicklungsarbeit erleichtert, sondern auch eine solide Grundlage für den Erfolg des Projekts gelegt.

0
0 Bewertungen

Jetzt selbst bewerten