Sådan opbygges en typesikker URL-forkorter i NodeJS med NestJS

Sådan opbygges en typesikker URL-forkorter i NodeJS med NestJS

Introduktion

I den moderne verden er URL-forkortere blevet et uundværligt værktøj til at håndtere lange og rodede webadresser. De giver mulighed for at konvertere lange URL’er til kortere og mere håndterbare versioner, hvilket gør det lettere at dele og huske dem. I denne artikel vil vi udforske, hvordan man opbygger en typesikker URL-forkorter i NodeJS ved hjælp af NestJS-rammeværket.

NestJS er et populært NodeJS-rammeværk til opbygning af skalerbare og vedligeholdelige webservices. Det implementerer et modulært designmønster og giver en række værktøjer til at håndtere datavalidering, routing og exception handling. Ved at drage fordel af NestJS’s funktioner kan vi opbygge en robust og sikker URL-forkorter, der imødekommer behovene i moderne webapplikationer.

H2 Opsætning af NestJS-projektet

Det første trin i at opbygge en URL-forkorter er at opsætte et NestJS-projekt. Du kan gøre dette ved at bruge den officielle NestJS-CLI (kommandolinjegrænseflade):


nest new url-shortener

Dette vil generere et skeletprojekt med en grundlæggende app-modul og hovedfil.

  Fix PS4-controlleren vil ikke oprette forbindelse til konsollen

H2 Oprettelse af URL-entiteten

Det næste trin er at definere URL-entiteten, der repræsenterer de forkortede URL’er i vores database. Vi bruger TypeScript til at definere vores entiteter, hvilket giver os mulighed for at oprette typesikre modeller:

typescript
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

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

@Column()
longUrl: string;

@Column()
shortUrl: string;
}

Entiteten definerer tre kolonner: id (primær nøgle), longUrl (den oprindelige lange URL) og shortUrl (den forkortede version).

H2 Definer URL-tjenesten

URL-tjenesten er ansvarlig for at håndtere URL-forkortning og -udvidelse. Vi bruger NestJS’s @Injectable()-dekoration til at oprette en serviceklasse:

typescript
import { Injectable } from '@nestjs/common';
import { Url } from './url.entity';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';

@Injectable()
export class UrlService {
constructor(
@InjectRepository(Url)
private readonly urlRepository: Repository<Url>,
) {}

async shorten(longUrl: string): Promise<Url> {
// Implementer forkortelse af URL'en her
}

async expand(shortUrl: string): Promise<Url> {
// Implementer udvidelse af URL'en her
}
}

I denne tjenesteklasse injicerer vi UrlRepository ved hjælp af @InjectRepository()-dekorationen. Dette giver os adgang til TypeORM-repositoriet til håndtering af databaseoperationer relateret til Url-entiteten.

H2 Implemente forkortelse og udvidelse

I UrlService skal vi implementere shorten()– og expand()-metoderne for at håndtere forkortelse og udvidelse af URL’er. Vi kan bruge en bibliotek til URL-forkortning såsom shortid eller nanoid til at generere unikke shortcodes.

typescript
import { shortid } from 'shortid';

async shorten(longUrl: string): Promise<Url> {
const shortcode = shortid.generate();
const shortUrl = ${process.env.BASE_URL}/${shortcode};

const url = new Url();
url.longUrl = longUrl;
url.shortUrl = shortUrl;

return this.urlRepository.save(url);
}

typescript
async expand(shortUrl: string): Promise<Url> {
return this.urlRepository.findOne({ where: { shortUrl } });
}

H2 Opret URL-controlleren

URL-controlleren er ansvarlig for at eksponere API-slutpunkter til URL-forkortning og -udvidelse. Vi bruger NestJS’s @Controller()– og @Post()-dekorationer til at definere vores controller:

typescript
import { Controller, Post, Body } from '@nestjs/common';
import { UrlService } from './url.service';

@Controller('url')
export class UrlController {
constructor(private readonly urlService: UrlService) {}

@Post('shorten')
async shorten(@Body() body: { longUrl: string }): Promise<Url> {
return this.urlService.shorten(body.longUrl);
}

@Post('expand')
async expand(@Body() body: { shortUrl: string }): Promise<Url> {
return this.urlService.expand(body.shortUrl);
}
}

H2 Implementering af datavalidering

Datavalidering er afgørende for at sikre, at vores URL-forkorter kun accepterer gyldige indgange. Vi kan bruge NestJS’s indbyggede datavalideringsmekanisme til at udføre serversidevalidering:

typescript
import { Body, ValidationPipe } from '@nestjs/common';

@Post('shorten')
async shorten(@Body(new ValidationPipe()) body: { longUrl: string }): Promise<Url> {
// Implementer forkortelse af URL'en her
}

Vi bruger ValidationPipe til at anvende datavalideringsregler til indgående HTTP-anmodninger.

H2 Konfiguration af miljøvariabler

Vi har brug for at konfigurere miljøvariabler for at angive base-URL’en til vores forkorter. Vi kan gøre dette ved at oprette en .env-fil i projektroden:


BASE_URL=https://example.com

Vi kan derefter få adgang til disse miljøvariabler i vores kode ved hjælp af process.env:

typescript
const shortUrl = ${process.env.BASE_URL}/${shortcode};

Konklusion

I denne artikel har vi gennemgået, hvordan man opbygger en typesikker URL-forkorter i NodeJS ved hjælp af NestJS-rammeværket. Vi har defineret en URL-entitet, skabt en URL-tjeneste til at håndtere forkortelse og udvidelse, oprettet en URL-controller til at eksponere API-slutpunkter og implementeret datavalidering for at sikre integriteten af indgående data. Ved at følge denne vejledning kan du opbygge en robust og vedligeholdelig URL-forkorter, der passer til behovene i moderne webapplikationer.

Ofte stillede spørgsmål

1. Hvad er fordelene ved at bruge NestJS til at bygge en URL-forkorter?
– Typesikkerhed
– Modulært design
– Indbygget datavalidering
– Enkel og hurtig udvikling

2. Hvad er de vigtigste overvejelser ved opbygning af en URL-forkorter?
– Datavalidering
– Unikke shortcodes
– Databasedesign
– Skalerbarhed

3. Hvordan sikrer jeg, at shortcodes er unikke?
– Brug af et bibliotek som shortid eller nanoid
– Implementering af en databasestøtte til unikke værdier

4. Hvordan håndterer jeg lange URL’er, der er for lange til at forkortet?
– Angiv en maksimal længde for indgående URL’er
– Giv en fejlbesked, der angiver, at URL’en er for lang

5. Hvordan måler jeg effektiviteten af min URL-forkorter?
– Spor antallet af forkortelser og udvidelser
– Analyserer klikfrekvenserne fra forkortede URL’er
– Få feedback fra brugere