index.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {
  2. Logger,
  3. Injectable,
  4. NestInterceptor,
  5. ExecutionContext,
  6. CallHandler,
  7. HttpStatus,
  8. BadRequestException,
  9. } from '@nestjs/common';
  10. import { map, catchError, tap } from 'rxjs/operators';
  11. import { Observable, throwError } from 'rxjs';
  12. export interface Response<T> {
  13. statusCode: number;
  14. data: T;
  15. }
  16. /**
  17. * transform response to client
  18. */
  19. @Injectable()
  20. export class TransformResInterceptor<T>
  21. implements NestInterceptor<T, Response<T>>
  22. {
  23. intercept(
  24. context: ExecutionContext,
  25. next: CallHandler,
  26. ): Observable<Response<T>> {
  27. return next
  28. .handle()
  29. .pipe(map((data) => ({ statusCode: HttpStatus.OK, data })));
  30. }
  31. }
  32. /**
  33. * Handle error in here.
  34. * Normally depend on status which from milvus service.
  35. */
  36. @Injectable()
  37. export class ErrorInterceptor implements NestInterceptor {
  38. intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
  39. return next.handle().pipe(
  40. catchError((err) => {
  41. Logger.error('---error interceptor---', err);
  42. if (err.response) {
  43. return throwError(err);
  44. }
  45. return throwError(new BadRequestException(err.toString()));
  46. }),
  47. );
  48. }
  49. }
  50. /**
  51. * add spent time looger when accessing milvus.
  52. */
  53. @Injectable()
  54. export class LoggingInterceptor implements NestInterceptor {
  55. intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
  56. const [req = {}, res = {}] = context.getArgs();
  57. const { ip = '', method = '', originalUrl = '', headers = {} } = req;
  58. const { statusCode = '' } = res;
  59. const ua = headers['user-agent'] || '';
  60. const now = Date.now();
  61. return next
  62. .handle()
  63. .pipe(
  64. tap(() => Logger.log(`${method} ${originalUrl} takes ${Date.now() - now}ms ip:${ip} ua:${ua} status:${statusCode}`)),
  65. );
  66. }
  67. }