İşlenmeyen istisnalar kafa karışıklığına ve hayal kırıklığına neden olabilir. Bunları istisna filtreleriyle temizleyin.
Nest.js istisna filtreleri, istisnaları genel olarak veya denetleyici bazında ele almanın ve ele almanın bir yolunu sağlar.
Hata işleme mantığını merkezileştirmenize, hata yanıtlarını biçimlendirmenize ve uygulamanız genelinde tutarlı hata işleme sağlamanıza olanak tanır. Özel durum filtreleri ve bunların uygulama hatalarını uygun şekilde işlemek için nasıl kullanılacağı hakkında bilgi edinin.
Nest.js'de Varsayılan Hata İşleme
Varsayılan olarak Nest.js, uygulama kodunuzun işlemediği istisnalarla ilgilenen bir istisna katmanına sahiptir.
Uygulamanızda işlenmeyen bir hata oluştuğunda Nest.js bunu yakalar ve istemciye 500 dahili sunucu hatası döndürür. Bu durumda Nest.js'nin döndürdüğü JSON şuna benzer:
{
"statusCode": 500,
"message": "Internal server error"
}
Kodunuzun attığı hata nesnesi bir hata içeriyorsa durum kodu ve bir İletiNest.js, varsayılan yanıt yerine bu değerleri döndürür.
Bu genel davranışı önlemek ve istemciye daha anlamlı bir hata yanıtı göndermek için uygulamanızda oluşabilecek tüm hataları özenle ele almanız gerekir. Bunu Nest.js'nin yerleşik veya özel istisna filtrelerini kullanarak başarabilirsiniz.
Özel İstisna Filtresi Oluşturma
Özel bir istisna filtresi oluşturma sürecini göstermek için, tüm HTTP istisnalarını işleyecek bir filtre oluşturmayı deneyin.
adlı bir dosyayla başlayın http.istisna.ts ve aşağıdaki içe aktarmaları buna ekleyin:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Bu ithalatlar aşağıdaki amaçlara hizmet eder.
- İstisna Filtresi: Bu, bir istisna filtresinin uygulanmasını açıklayan bir arayüzdür.
- Yakalamak: Bu, bir sınıfı Nest istisna filtresi olarak işaretleyen bir dekoratördür.
- ArgümanlarAna Bilgisayar: Bu arayüz, bir işleyiciye iletilen bağımsız değişkenleri almak için yöntemler sağlar. Bağımsız değişkenleri almak için uygun yürütme bağlamını (örneğin, HTTP, RPC veya WebSockets) seçmenize olanak tanır.
- HttpException: Bu, temel Nest HTTP istisnasını tanımlayan bir sınıftır.
- Rica etmek & Cevap: Bunlar sırasıyla Express.js istek ve yanıt nesnesinin arayüzleridir.
Daha sonra bir sınıf oluşturun, HttpExceptionFiltre, uygulayan İstisna Filtresi. Şununla açıklama ekleyin: Yakalamak HttpExceptions'ı işlediğini belirtmek için dekoratör:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Daha sonra sınıfı şu kodla doldurun:
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',
});
}
Bu kod bloğu, ArgumentsHost nesnesinden istek ve yanıt nesnelerini alır ve istisnadan ilgili bilgileri çıkarır. İstemciye hatayla ilgili ayrıntıları içeren yapılandırılmış bir JSON nesne yanıtı döndürür.
Bağlama İstisna Filtreleri
İhtiyaçlarınıza bağlı olarak bir istisna filtresini bir denetleyiciye veya uygulamanızın tamamına bağlayabilirsiniz.
Bir istisna filtresini global olarak bağlamak için öncelikle istisna filtresini cihazınıza aktarın. ana.ts dosya. Ardından, istisna filtrenizin bir örneğini app.useGlobalFilters yöntem:
// 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();
Bir istisnayı bir denetleyiciye bağlamak için Filtreleri Kullan dekoratör ve istisna filtreniz. Denetleyici sınıfınıza şununla açıklama ekleyin: @UseFilters dekoratöre gidin ve istisna filtrenizin bir örneğini dekoratöre argüman olarak iletin:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Filtrenizi nereye bağlayacağınız, hata işlemenizin kapsamını belirleyecektir. Denetleyiciye bağlı filtreler yalnızca bağladığınız denetleyiciye hitap eder ve uygulamaya bağlı filtreler uygulamanın tamamını karşılar.
Hata Atmak İçin Yerleşik İstisnaları Kullanma
Nest.js, hata oluşturmak için kullanabileceğiniz yerleşik istisna sınıfları sağlar.
Örneğin 404'ü atabilirsiniz. durum kodu hataları ile Bulunamadıİstisna sınıf:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Bu kod bloğu şunu kullanır: koşullu bir ifade Verilen kullanıcının var olup olmadığını kontrol etmek için. Değilse, kullanarak 404 hatası atar. Bulunamadıİstisna, bir mesajı argüman olarak iletmek.
Ortak Yerleşik İstisna Sınıfları
Diğer yerleşik istisna sınıfları aşağıdakileri içerir ancak bunlarla sınırlı değildir.
- BadRequestException: Durum koduyla hatalı bir isteği belirten bir istisna atar 400. Bu istisnayı, istemcinin isteğinin geçersiz veya hatalı biçimlendirilmiş olması ve sunucunun, istemcinin hatası nedeniyle bu isteği işleyememesi durumunda kullanabilirsiniz. Bu genellikle müşterinin isteği geçerli kılmak için değiştirmesi gerektiği anlamına gelir.
- Yetkisiz İstisna: Durum koduyla yetkisiz erişimi belirten bir istisna atar 401. Bir kullanıcının kimliği doğrulanmadığında veya bir kaynağa erişim için gerekli izinlere sahip olmadığında bu istisnayı kullanabilirsiniz.
- Yasakİstisna: Durum koduyla yasak erişimi belirten bir istisna atar 403. Bir kullanıcı şu durumlarda bu istisnayı kullanabilirsiniz: kimliği doğrulanmış ancak yetkili değil Belirli bir eylemi gerçekleştirmek için.
- İstekTimeoutException: İsteğin durum koduyla zaman aşımına uğradığını belirten bir istisna atar. 408. Bu istisnayı, işlenmesi çok uzun sürdüğü için sunucu bir isteği sonlandırdığında kullanabilirsiniz.
- Çatışma İstisnası: Durum koduyla çakışmayı belirten bir istisna atar 409. Bu istisnayı, istemcinin isteği ile kaynağın geçerli durumu arasında bir çelişki olduğunda (örneğin, zaten var olan bir kaynağı oluşturmaya çalışırken) kullanabilirsiniz.
- InternalServerErrorException: Durum koduyla dahili sunucu hatasını belirten bir istisna atar 500. Bu istisnayı, sunucu tarafında, dahili bir sorun nedeniyle sunucunun isteği yerine getiremediğini belirten beklenmeyen bir hata oluştuğunda kullanabilirsiniz.
Nest.js'de Hata İşleme için En İyi Uygulamalar
Nest.js'de hataları işlerken, istisnaları genel olarak veya denetleyici başına yakalamak ve işlemek için istisna filtreleri kullandığınızdan emin olun. Belirli istisna türleri için özel filtreler de oluşturabilirsiniz.
Ayrıca, doğru ve anlamlı hatalar oluşturmak için uygun yerleşik istisna sınıflarını kullandığınızdan emin olun. Bu uygulamalar Nest.js uygulamalarınızın güvenilirliğini önemli ölçüde artırabilir.