Mat*_*ski 4 javascript node.js express nestjs
我刚刚开始了解 NestJS,我想知道如何操纵特定端点的响应超时?
我可以在服务器级别上执行此操作,例如:
const server = await app.listen(...);
server.setTimeout(1800000)
Run Code Online (Sandbox Code Playgroud)
或者在端点上,这看起来很糟糕:
@Post('/test')
public async import(...props, @Res() res: Response): Promise<string> {
res.setTimeout(1800000)
}
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能在控制器或方法级别上做到这一点呢?我尝试使用拦截器来增加端点的超时,例如:
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);
}),
);
};
};
Run Code Online (Sandbox Code Playgroud)
并将其应用在端点上,例如:
@Post('/test')
@UseInterceptors(TimeoutInterceptor)
public async import(...props, @Res() res: Response): Promise<string> {
long running code...
}
Run Code Online (Sandbox Code Playgroud)
虽然拦截器被触发,所以我能够记录一些东西,但超时似乎根本不起作用:/
Set*_*eti 13
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();
};
}
Run Code Online (Sandbox Code Playgroud)
import { applyDecorators, SetMetadata, UseInterceptors } from '@nestjs/common';
const SetTimeout = (timeout: number) => SetMetadata('request-timeout', timeout);
export function SetRequestTimeout(timeout: number = 60000) {
return applyDecorators(
SetTimeout(timeout),
UseInterceptors(TimeoutInterceptor),
);
}
Run Code Online (Sandbox Code Playgroud)
您可能需要与提供者进行一些合作(向其中添加拦截器),但现在您可以使用@SetRequestTimeout()
or@SetRequestTimeout(10000)
来方便起见。
归档时间: |
|
查看次数: |
15085 次 |
最近记录: |