Ключові моменти:
1. Перевірка бізнес-логіки на рівні БД – використання UNIQ/CHECK-обмежень у схемі бази даних.
2. Робота з кодами помилок драйвера – наприклад, обробка стандартних кодів PostgreSQL (23505, 23514, 40001 тощо).
3. Транзакції через typeorm-transactional – оскільки транзакції через
@Transaction, фільтр є єдиним місцем, де можна перехопити помилку на рівні запиту.Приклад фільтра, щоб проілюструвати ідею:
import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
import { Catch } from '@nestjs/common';
import { Response } from 'express';
import { DatabaseError } from 'pg';
import { QueryFailedError } from 'typeorm';
@Catch(QueryFailedError)
export class TypeormExceptionFilter implements ExceptionFilter {
catch(exception: QueryFailedError, host: ArgumentsHost) {
const context = host.switchToHttp();
const response = context.getResponse<Response>();
if (exception.driverError instanceof DatabaseError) {
if (exception.driverError.code === '40001') {
return response.status(409).send({
message: 'Conflict. Please try again later.',
});
}
if (exception.driverError.code === '23505') {
return response.status(400).send({
message: 'Should be unique',
});
}
if (exception.driverError.code === '23514') {
switch (exception.driverError.constraint) {
case 'not_negative_balance_check': {
return response.status(400).send({
message: 'Not enough balance',
});
}
//…
}
}
}
throw exception;
}
}
PS Цей метод не скасовує, а доповнює моніторинг журналу помилок вашої бази даних.