Bygg en NestJS CRUD REST API med TypeORM & PostgreSQL

I likhet med andre Node.js-rammeverk, tilbyr Nest.js en solid samling verktøy for å utvikle pålitelige og skalerbare backend-tjenester. Det er likevel avgjørende å forstå hvordan man implementerer opprett-, lese-, oppdaterings- og sletteoperasjoner (CRUD) på en effektiv måte i Nest.js – dette utgjør kjernen i API-utvikling.

Denne veiledningen tar for seg hvordan du bygger en Nest.js CRUD REST API ved å bruke TypeORM og en PostgreSQL-database.

Start med Nest.js

For å begynne, installer Nest.js-kommandolinjeverktøyet:

npm i -g @nestjs/cli

Deretter oppretter du et nytt prosjekt ved å kjøre:

nest new crud-app

Verktøyet vil be deg om å velge en pakkebehandler. Velg den du foretrekker. Vi benytter npm, standard pakkebehandler for Node.

CLI vil opprette et grunnleggende Nest.js-prosjekt med alle nødvendige konfigurasjonsfiler og initielle avhengigheter for å kjøre applikasjonen.

Til slutt, naviger til prosjektmappen og start utviklingsserveren.

cd crud-app
npm run start

Du finner prosjektkoden i det tilhørende GitHub-repositoriet.

Opprett en PostgreSQL-database

Denne opplæringen bruker en Cloud PostgreSQL-forekomst, men du kan også bruke en lokal PostgreSQL-database. Du kan installere PostgreSQL på Windows, macOS eller Linux.

For å konfigurere en skybasert PostgreSQL-forekomst:

  • Gå til ElephantSQL, registrer deg og logg inn på kontrollpanelet.
  • Klikk på «Opprett ny instans» øverst til venstre på siden for å opprette en ny instans for applikasjonen din.
  • Fyll inn navnet på instansen din, velg gratisabonnementet, og velg til slutt regionen for å fullføre oppsettprosessen.
  • Etter at databaseinstansen er opprettet, gå til innstillingssiden og kopier den angitte database-URLen.

Konfigurer databasetilkoblingen

Opprett en .env-fil i prosjektets rotkatalog og lim inn databaseforbindelses-URLen på følgende måte:

DATABASE_URL="<din tilkoblings-URL her>"

Installer deretter disse pakkene:

npm install pg typeorm @nestjs/typeorm @nestjs/config

Gå videre og opprett en databasemodul ved hjelp av CLI-verktøyet.

nest g module database

Åpne filen database/database.module.ts og legg til følgende kode for databasekonfigurasjon:

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from '../users/models/user.entity';

@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],

useFactory: async (configService: ConfigService) => ({
type: 'postgres',
url: configService.get('DATABASE_URL'),
entities: [User],
synchronize: true
}),
}),
],
})

export class DatabaseModule {}

Denne databasemodulen håndterer tilkoblingen ved å konfigurere TypeORM-modulen med den nødvendige tilkoblingsparameteren, databasens URL.

I tillegg definerer den brukerentiteten som en del av konfigurasjonen, og angir strukturen og egenskapene til dataene som er lagret i PostgreSQL-databasetabellen.

På dette tidspunktet vil koden sannsynligvis vise en feil fordi du ikke har opprettet brukerentiteten ennå. Dette vil du gjøre i de kommende trinnene.

Oppdater app.module.ts-filen

Til slutt oppdaterer du hovedapplikasjonsmodulen for å inkludere konfigurasjonen for databasemodulen.

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './database/database.module';

@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule,
],

controllers: [AppController],
providers: [AppService],
})

export class AppModule {}

Definer en brukermodul

Brukermodulen fungerer som en sentralisert komponent som er ansvarlig for å kapsle inn og administrere logikken som kreves for å implementere APIets CRUD-funksjonalitet.

Kjør denne terminalkommandoen for å lage APIets brukermodul.

nest g module users

CLI-verktøyet oppdaterer app.module.ts-filen automatisk for å gjenspeile de utførte endringene, i tillegg til å opprette brukermodulen. Dette sikrer at den nyopprettede modulen, brukere, er riktig integrert i applikasjonens modulkonfigurasjon.

Opprett en brukerentitet

TypeORM er et bibliotek for objektrelasjonskartlegging (ORM) som forenkler databaseinteraksjoner i applikasjoner som bruker TypeScript ved å knytte JavaScript-objekter til databasetabeller.

Ved å opprette en brukerentitet ved hjelp av TypeORM, definerer du strukturen og egenskapene til brukerdataene i PostgreSQL-databasen.

I brukermappen oppretter du en ny fil models/user.entity.ts og legger til følgende kode.

import { Entity, PrimaryGeneratedColumn, Column, } from "typeorm";

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@Column()
email: string;
}

Brukerentiteten definerer strukturen til brukerdataene som lagres i databasen. I dette tilfellet er det ID-en som primærnøkkelkolonnen, og navn- og e-postkolonnene og deres tilsvarende egenskaper.

Opprett CRUD API-tjenesten

Opprett nå API-tjenesten som skal administrere logikken for CRUD-operasjonene, ved å kjøre kommandoen nedenfor:

nest g service users

Åpne filen user-auth.service.ts og legg til denne koden:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import {User} from './models/user.entity';

@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}

async findAll(): Promise<User[]> {
return this.userRepository.find();
}

async findOne(id: number): Promise<User> {
return this.userRepository.findOne({ where: { id } });
}

async create(user: Partial<User>): Promise<User> {
const newuser = this.userRepository.create(user);
return this.userRepository.save(newuser);
}

async update(id: number, user: Partial<User>): Promise<User> {
await this.userRepository.update(id, user);
return this.userRepository.findOne({ where: { id } });
}

async delete(id: number): Promise<void> {
await this.userRepository.delete(id);
}
}

Denne UsersService-klassen definerer ulike API-metoder dedikert til å håndtere CRUD-operasjoner. Disse metodene inkluderer henting av alle brukeres data, finne en spesifikk bruker ved hjelp av ID-nummeret, opprette en ny bruker, oppdatere en eksisterende bruker og en metode for å slette en spesifikk brukers data i databasen.

Definer en kontroller for API

Opprett en kontroller som skal administrere API-endepunktene for brukerrelaterte operasjoner.

nest g controller users

Deretter legger du til koden nedenfor i filen users.controller.ts.

import { Controller, Get, Post, Body, Put, Param, Delete, NotFoundException, HttpCode } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './models/user.entity';

@Controller('api/users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}

@Get()
async findAll(): Promise<User[]> {
return this.usersService.findAll();
}

@Post()
@HttpCode(201)
async create(@Body() user: User): Promise<User> {
const createdUser = await this.usersService.create(user);
return createdUser;
}

@Put(':id')
async update (@Param('id') id: number, @Body() user: User): Promise<any> {
await this.usersService.update(id, user);
return { message: 'User updated successfully' };
}

@Delete(':id')
async delete(@Param('id') id: number): Promise<any> {
const user = await this.usersService.findOne(id);

if (!user) {
throw new NotFoundException('User does not exist!');
}

await this.usersService.delete(id);
return { message: 'User deleted successfully' };
}
}

Kontrolleren administrerer API-endepunkter for brukeroperasjoner. Den håndterer GET-forespørsler om å hente alle brukere, POST-forespørsler om å opprette nye brukere, PUT-forespørsler om å oppdatere eksisterende brukere og DELETE-forespørsler om å slette brukere.

Ved å bruke UsersService og samhandle med brukerentiteten, gir denne kontrolleren et komplett API for å administrere brukerrelaterte operasjoner på dataene som er lagret i databasen.

Oppdater users.module.ts-filen

Til slutt oppdaterer du users.module.ts-filen som vist nedenfor for å sikre at du inkluderer brukerentiteten og TypeORM-modulen, som oppretter forbindelsen til databasen.

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './models/user.entity';

@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService]
})

export class UsersModule {}

Til slutt fortsetter du og starter utviklingsserveren for å teste CRUD-operasjonene med Postman.

npm run start

Serveren starter på port 3000, og du kan sende API-forespørsler til den på http://localhost:3000/api/users.

Utvikle backend-applikasjoner med Nest.js

Enten du utvikler en enkel REST API eller en kompleks webapp, tilbyr Nest.js et omfattende sett med funksjoner og muligheter for å bygge et pålitelig og robust backend-system.

Nest.js tilbyr en mer strukturert tilnærming til prosjektutvikling enn Express.js. Dette sikrer at du trygt kan bygge, skalere og vedlikeholde komplekse applikasjoner, takket være det organiserte og modulære designmønsteret.