Добавьте заголовок идентификатора корреляции к исходящим запросам Axios из приложения NestJS

#angular #axios #nestjs

Вопрос:

Я генерирую а Correlation-ID/uuid , из UI которого передается как а Request Header . Запрос отправляется на NestJS который звонит дальше 2 more APIs .

Что я хочу сделать, так это передать то же correlation id самое, сгенерированное от UI 2 исходящих API calls от NestJS . Я попытался использовать interceptors , но не смог сохранить контекст. Единственный оставшийся у меня вариант-перейти header вручную к HttpService тому, чего я хочу избежать.

Есть ли перехватчик для исходящих запросов NestJS ?

  1. Сделайте вызов API из пользовательского интерфейса в NestJS
  2. В этом вызове API заголовок запроса содержит Correlation ID
  3. Запрос принимается контроллером в NestJS
  4. Контроллер выполняет еще 2 вызова API
  5. Я хочу передать это Correlation ID сгенерированное в UI 2 вызова API

Проблема в axios interceptor том, что он не отслеживает исходящие запросы.

 import {
  CallHandler,
  ExecutionContext,
  HttpException,
  Injectable,
  NestInterceptor
} from '@nestjs/common';
import axios, { AxiosResponse } from 'axios';

import { ApiLoggingService } from '../api-logging/logging.service';
import { CORRELATION_ID } from 'api-core';
import { Observable } from 'rxjs';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  axiosInterceptor = null;
  constructor(public logger: ApiLoggingService) {}

  private getLabels(response: AxiosResponse): {} {
    const errorLabels = {};
    const envLabel = 'env';
    errorLabels[CORRELATION_ID] =
      response.headers[CORRELATION_ID.toLowerCase()];
    errorLabels[envLabel] = process.env.ENVIRONMENT_NAME;
    return errorLabels;
  }
  private logMessages(response: AxiosResponse, timestamp: number): void {
    this.logger.info(
      this.getLabels(response),
      `Time taken by http request ${response.config.url} : ${
        Date.now() - timestamp
      }ms`
    );
  }
  intercept(
    context: ExecutionContext,
    next: CallHandler
  ): Observable<HttpException> {
    const now = Date.now();
    if (!!this.axiosInterceptor || this.axiosInterceptor >= 0) {
      axios.interceptors.response.eject(this.axiosInterceptor);
    }

    this.axiosInterceptor = axios.interceptors.response.use(
      (response: AxiosResponse) => {
        /* istanbul ignore next */
        // NOTE : If more scenarios are discovered where custom headers are required then
        // we need to remove this interceptor and instead write a service to add headers
        this.logMessages(response, now);
        return response;
      },
      (err) => {
        this.logMessages(err.response, now);
        this.logger.error(
          this.getLabels(err.response),
          `HTTP Exception response for ${err.config.url}: ${err.message}`
        );
        throw err;
      }
    );
    return next.handle();
  }
}

 

Любая помощь приветствуется.