Käsittelemättömät poikkeukset voivat aiheuttaa hämmennystä ja turhautumista. Puhdista ne poikkeussuodattimilla.

Nest.js-poikkeussuodattimet tarjoavat tavan siepata ja käsitellä poikkeuksia maailmanlaajuisesti tai ohjainkohtaisesti.

Niiden avulla voit keskittää virheenkäsittelylogiikan, muotoilla virhevastauksia ja tarjota johdonmukaisen virheenkäsittelyn kaikkialla sovelluksessasi. Opi poikkeussuodattimista ja niiden käyttämisestä sovellusvirheiden asianmukaiseen käsittelyyn.

Nest.js: n oletusvirheiden käsittely

Nest.js: ssä on oletuksena poikkeustaso, joka käsittelee poikkeuksia, joita sovelluskoodisi ei käsittele.

Kun sovelluksessasi tapahtuu käsittelemätön virhe, Nest.js havaitsee sen ja palauttaa asiakkaalle 500 sisäisen palvelinvirheen. JSON, jonka Nest.js palauttaa tässä tapauksessa, näyttää tältä:

{
"statusCode": 500,
"message": "Internal server error"
}

Jos koodisi heittämä virheobjekti sisältää a statusCode ja a viesti, Nest.js palauttaa nämä arvot oletusvastauksen sijaan.

Välttääksesi tämän yleisen toiminnan ja lähettääksesi asiakkaalle merkityksellisemmän virhevastauksen, sinun on käsiteltävä huolellisesti kaikkia sovelluksessasi mahdollisesti ilmeneviä virheitä. Voit saavuttaa tämän käyttämällä Nest.js: n sisäänrakennettuja tai mukautettuja poikkeussuodattimia.

instagram viewer

Mukautetun poikkeussuodattimen luominen

Esittele mukautetun poikkeussuodattimen luontiprosessi luomalla suodatin, joka käsittelee kaikki HTTP-poikkeukset.

Aloita tiedostolla nimeltä http.exception.ts ja lisää siihen seuraavat tuontituotteet:

import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';

import { Request, Response } from'express';

Tämä tuonti palvelee seuraavia tarkoituksia.

  • Poikkeussuodatin: Tämä on rajapinta, joka kuvaa poikkeussuodattimen toteutusta.
  • Ottaa kiinni: Tämä on koristelu, joka merkitsee luokan Nest-poikkeussuodattimeksi.
  • ArgumentsHost: Tämä käyttöliittymä tarjoaa menetelmiä käsittelijälle välitettävien argumenttien hakemiseen. Sen avulla voit valita sopivan suorituskontekstin (esim. HTTP, RPC tai WebSockets), josta argumentit haetaan.
  • HttpException: Tämä on luokka, joka määrittää perus Nest HTTP -poikkeuksen.
  • Pyyntö & Vastaus: Nämä ovat Express.js-pyyntö- ja vastausobjektin liitännät.

Luo seuraavaksi luokka, HttpExceptionFilter, joka toteuttaa Poikkeussuodatin. Merkitse se Ottaa kiinni sisustaja osoittaakseen, että se käsittelee HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Täytä seuraavaksi luokka tällä koodilla:

catch(exception: HttpException, host: ArgumentsHost) {
// Get the response object from the arguments host
const ctx = host.switchToHttp();
const response = ctx.getResponse();

// Get the request object from the arguments host
const request = ctx.getRequest();

// Get the status code from the exception
const status = exception.getStatus();

// Send a JSON response using the response object
response.status(status).json({
statusCode: status,
timestamp: newDate().toISOString(),
path: request.url,
message:
exception.message
|| exception.getResponse()['message']
|| 'Internal Server Error',
});
}

Tämä koodilohko hakee pyyntö- ja vastausobjektit ArgumentsHost-objektista ja poimii olennaiset tiedot poikkeuksesta. Se palauttaa asiakkaalle jäsennellyn JSON-objektivastauksen, joka sisältää tiedot virheestä.

Sitovat poikkeussuodattimet

Voit sitoa poikkeussuodattimen ohjaimeen tai koko sovellukseesi tarpeidesi mukaan.

Jos haluat sitoa poikkeussuodattimen maailmanlaajuisesti, tuo poikkeussuodatin ensin omaan main.ts tiedosto. Välitä sitten poikkeussuodattimen esiintymä app.useGlobalFilters menetelmä:

// main.ts
import { NestFactory } from'@nestjs/core';
import { AppModule } from'./app.module';
import { HttpExceptionFilter } from'./exception/http.exception';

asyncfunctionbootstrap() {
const app = await NestFactory.create(AppModule);

// Bind filter to the application
app.useGlobalFilters(new HttpExceptionFilter());

await app.listen(4050);
}

bootstrap();

Jos haluat sitoa poikkeuksen ohjaimeen, tuo Käytä suodattimia sisustaja ja poikkeussuodattimesi. Merkitse ohjainluokkasi @Käytä suodattimia sisustaja ja välitä poikkeussuodattimesi esiintymä argumenttina sisustajalle:

@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}

Suodattimen sidontapaikka määrittää virheiden käsittelyn laajuuden. Ohjaimeen sidotut suodattimet palvelevat vain ohjainta, johon olet sidottu, ja sovellukseen sidotut suodattimet koko sovelluksen.

Sisäänrakennettujen poikkeusten käyttäminen virheiden aiheuttamiseen

Nest.js tarjoaa sisäänrakennettuja poikkeusluokkia, joiden avulla voit tehdä virheitä.

Voit esimerkiksi heittää 404:n tilakoodin virheitä kanssa NotFoundException luokka:

 getUserById(id: number) {
const user = users.find((user) => user.id id);

if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}

Tämä koodilohko käyttää ehdollinen lausunto tarkistaaksesi, onko annettu käyttäjä olemassa. Jos ei, se antaa 404-virheen käyttämällä NotFoundException, välittää viestin argumenttina.

Yleiset sisäänrakennetut poikkeusluokat

Muita sisäänrakennettuja poikkeusluokkia ovat, mutta niihin rajoittumatta, seuraavat.

  • BadRequestException: Heittää poikkeuksen, joka ilmaisee virheellisen pyynnön tilakoodilla 400. Voit käyttää tätä poikkeusta, kun asiakkaan pyyntö on virheellinen tai väärin muotoiltu, eikä palvelin voi käsitellä sitä asiakkaan virheen vuoksi. Se tarkoittaa yleensä, että asiakkaan on muutettava pyyntöä tehdäkseen siitä kelvollisen.
  • Luvaton poikkeus: Heittää poikkeuksen, joka ilmaisee luvattoman käytön tilakoodilla 401. Voit käyttää tätä poikkeusta, kun käyttäjää ei ole todennettu tai hänellä ei ole tarvittavia oikeuksia käyttää resurssia.
  • Kielletty poikkeus: Heittää poikkeuksen, joka osoittaa kiellettyä käyttöä tilakoodilla 403. Voit käyttää tätä poikkeusta, kun käyttäjä on todennettu mutta ei valtuutettu suorittaaksesi tietyn toiminnon.
  • RequestTimeoutException: Heittää poikkeuksen, joka osoittaa, että pyyntö on aikakatkaissut tilakoodilla 408. Voit käyttää tätä poikkeusta, kun palvelin lopettaa pyynnön, koska sen käsittely kesti liian kauan.
  • ConflictException: Heittää poikkeuksen, joka ilmaisee ristiriidan tilakoodin kanssa 409. Voit käyttää tätä poikkeusta, jos asiakkaan pyynnön ja resurssin nykyisen tilan välillä on ristiriita, esimerkiksi kun yritetään luoda jo olemassa olevaa resurssia.
  • InternalServerErrorException: Heittää poikkeuksen, joka ilmaisee sisäisen palvelinvirheen tilakoodilla 500. Voit käyttää tätä poikkeusta, kun palvelinpuolella tapahtuu odottamaton virhe, joka osoittaa, että palvelin ei voi täyttää pyyntöä sisäisen ongelman vuoksi.

Nest.js: n virheiden käsittelyn parhaat käytännöt

Kun käsittelet Nest.js: n virheitä, muista käyttää poikkeussuodattimia poikkeuksien tunnistamiseen ja käsittelemiseen maailmanlaajuisesti tai ohjainkohtaisesti. Voit myös luoda mukautettuja suodattimia tietyille poikkeustyypeille.

Varmista lisäksi, että käytät asianmukaisia ​​sisäänrakennettuja poikkeusluokkia oikeiden ja merkityksellisten virheiden tekemiseen. Nämä käytännöt voivat parantaa merkittävästi Nest.js-sovellustesi luotettavuutta.