Recién comencé a aprender sobre NestJS y me pregunto cómo podría manipular el tiempo de espera de respuesta para puntos finales particulares.
Podría hacerlo a nivel de servidor como:
const server = await app.listen(...); server.setTimeout(1800000)o en el punto final, que se ve mal:
@Post('/test') public async import(...props, @Res() res: Response): Promise<string> { res.setTimeout(1800000) }Pero, ¿cómo podría hacer eso a nivel de controlador o método? He intentado aumentar el tiempo de espera en el punto final usando interceptores como:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler, RequestTimeoutException } from '@nestjs/common'; import { Observable, throwError, TimeoutError } from 'rxjs'; import { catchError, take, timeout } from 'rxjs/operators'; @Injectable() export class TimeoutInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { return next.handle().pipe( timeout(1800000), catchError(err => { if (err instanceof TimeoutError) { return throwError(() => new RequestTimeoutException()); } return throwError(() => err); }), ); }; };Y aplicarlo en el punto final como:
@Post('/test') @UseInterceptors(TimeoutInterceptor) public async import(...props, @Res() res: Response): Promise<string> { long running code... }Aunque el interceptor se activa, puedo registrar algo, el tiempo de espera no parece funcionar en absoluto:/
Bien, si alguien tiene curiosidad, esto es lo que he hecho:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; @Injectable() export class TimeoutInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { const response = context.switchToHttp().getResponse(); response.setTimeout(600000) return next.handle(); }; };import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; @Injectable() export class TimeoutInterceptor implements NestInterceptor { constructor( private readonly reflector: Reflector, ) {} intercept(context: ExecutionContext, next: CallHandler): Observable<any> { const response = context.switchToHttp().getResponse(); const timeout = this.reflector.get<number>('request-timeout', context.getHandler()) || 60000; response.setTimeout(timeout ) return next.handle(); }; }; import { applyDecorators, SetMetadata, UseInterceptors } from '@nestjs/common'; const SetTimeout = (timeout: number) => SetMetadata('request-timeout', timeout); export function SetRequestTimeout(timeout: number = 600000) { return applyDecorators( SetTimeout(timeout), UseInterceptors(TimeoutInterceptor), ); } Es posible que deba jugar un poco con los proveedores (agregarle el interceptor) Pero ahora solo puede usar @SetRequestTimeout() o @SetRequestTimeout(10000) por conveniencia.