Обработка таймаутов ответа в Nest.js: подробное руководство

При разработке серверной части обработка тайм-аутов ответа имеет решающее значение для обеспечения стабильности и надежности вашего приложения. Nest.js, популярная платформа Node.js, предоставляет различные методы для эффективной обработки таймаутов ответа. В этой статье мы рассмотрим несколько подходов к обработке времени ожидания ответа в Nest.js, а также приведем примеры кода.

Метод 1: установка глобального тайм-аута
Установив глобальный тайм-аут для всех запросов, вы можете гарантировать, что ни один запрос не превысит указанный лимит времени. Этого можно добиться с помощью промежуточного программного обеспечения Nest.js. Вот пример:

// main.ts
import { NestFactory } from '@nestjs/core';
import { TimeoutInterceptor } from './timeout.interceptor';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useGlobalInterceptors(new TimeoutInterceptor(5000)); // Timeout set to 5 seconds

  await app.listen(3000);
}
bootstrap();
// timeout.interceptor.ts
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable, TimeoutError } from 'rxjs';
import { timeout } from 'rxjs/operators';
@Injectable()
export class TimeoutInterceptor implements NestInterceptor {
  constructor(private readonly timeoutValue: number) {}
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(timeout(this.timeoutValue));
  }
}

Метод 2: декоратор таймаута
Nest.js позволяет применять таймауты к отдельным маршрутам или контроллерам с помощью специального декоратора. Вот пример:

// timeout.decorator.ts
import { SetMetadata } from '@nestjs/common';
export const Timeout = (ms: number) => SetMetadata('timeout', ms);
// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { Timeout } from './timeout.decorator';
@Controller('users')
export class AppController {
  @Get()
  @Timeout(3000) // Timeout set to 3 seconds
  getUsers(): string {
    // Your controller logic here
  }
}

Метод 3: пользовательское промежуточное программное обеспечение
Вы можете создать собственное промежуточное программное обеспечение для обработки тайм-аутов запросов на определенных маршрутах. Вот пример:

// timeout.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class TimeoutMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    const timeoutMs = 5000; // Timeout set to 5 seconds

    const timeoutId = setTimeout(() => {
      clearTimeout(timeoutId);
      res.status(504).send('Request timed out');
    }, timeoutMs);

    next();
  }
}
// app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { TimeoutMiddleware } from './timeout.middleware';
@Module({
  controllers: [AppController],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(TimeoutMiddleware).forRoutes('*');
  }
}

Обработка тайм-аутов ответа — важнейший аспект разработки серверной части. В этой статье мы рассмотрели три метода обработки тайм-аутов ответа в Nest.js: установка глобального тайм-аута, использование декоратора тайм-аута и создание специального промежуточного программного обеспечения. Внедрив эти методы, вы можете быть уверены, что ваше приложение Nest.js эффективно обрабатывает тайм-ауты ответа, повышая его стабильность и удобство для пользователей.

Не забудьте настроить значения тайм-аута в соответствии с конкретными потребностями вашего приложения.