При разработке серверной части обработка тайм-аутов ответа имеет решающее значение для обеспечения стабильности и надежности вашего приложения. 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 эффективно обрабатывает тайм-ауты ответа, повышая его стабильность и удобство для пользователей.
Не забудьте настроить значения тайм-аута в соответствии с конкретными потребностями вашего приложения.