#angular #axios #nestjs
Вопрос:
Я генерирую а Correlation-ID/uuid
, из UI
которого передается как а Request Header
. Запрос отправляется на NestJS
который звонит дальше 2 more APIs
.
Что я хочу сделать, так это передать то же correlation id
самое, сгенерированное от UI
2 исходящих API calls
от NestJS
. Я попытался использовать interceptors
, но не смог сохранить контекст. Единственный оставшийся у меня вариант-перейти header
вручную к HttpService
тому, чего я хочу избежать.
Есть ли перехватчик для исходящих запросов NestJS
?
- Сделайте вызов API из пользовательского интерфейса в
NestJS
- В этом вызове API заголовок запроса содержит
Correlation ID
- Запрос принимается контроллером в
NestJS
- Контроллер выполняет еще 2 вызова API
- Я хочу передать это
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();
}
}
Любая помощь приветствуется.