Как создать несколько экземпляров Ax ios в NestJS - PullRequest
0 голосов
/ 14 июля 2020

Я конвертирую существующее приложение Express в Nest JS, в настоящее время у меня есть файл конфигурации, в котором я создаю несколько экземпляров ax ios для каждого микросервиса:

export const writeModelApi = axios.create({
  baseURL: getWriteModelApiUrl(),
});

export const readModelApi = axios.create({
  baseURL: getReadModelApiUrl(),
});

export const configApi = axios.create({
  baseURL: getConfigApiUrl(),
});

function addCamelizeInterceptors(api: any) {
  api.interceptors.request.use(
    (config: AxiosRequestConfig): AxiosRequestConfig => {
      config.data = decamelizeKeys(config.data);

      return config;
    },
    (error: any) => {
      return Promise.reject(error);
    }
  );
  
  api.interceptors.response.use(
    (response: AxiosResponse): AxiosResponse => {
      response.data = camelizeKeys(response.data);

      return response;
    },
    (error: any) => {
      if (error.response != null) { 
        error.response.data = camelizeKeys(error.response.data);
      }

      return Promise.reject(error);
    }
  );
}

addCamelizeInterceptors(taskingApi);
addCamelizeInterceptors(readModelApi);
addCamelizeInterceptors(configApi);

Я думал о репликации это с использованием общих модулей в гнезде js, в настоящее время у меня есть это:

  • ReadModelModule
@Module({
  imports: [
    HttpModule.register({
      baseURL: getReadModelApiUrl(),
    }),
  ],
  providers: [ReadModelService],
  exports: [ReadModelService],
})
export class ReadModelModule implements OnModuleInit {
  constructor(@Inject() private httpService: ReadModelService) {}

  public onModuleInit() {
    addCamelizeInterceptors(this.httpService.axiosRef);
  }
}

  • ReadModelService
@Injectable()
export class ReadModelService extends HttpService {}

, но nest выдает ошибку:

[ExceptionHandler] Nest can't resolve dependencies of the ReadModelModule (?). Please make sure that the argument dependency at index [0] is available in the ReadModelModule context.

Potential solutions:
- If dependency is a provider, is it part of the current ReadModelModule?
- If dependency is exported from a separate @Module, is that module imported within ReadModelModule?
  @Module({
    imports: [ /* the Module containing dependency */ ]
  })

Я действительно не знаю, как это сделать. Может кто поможет?

Ответы [ 2 ]

0 голосов
/ 16 июля 2020

Для справки в будущем я немного взломал. Я просмотрел код Nest Js и заметил, что в настоящее время нет возможности расширить HttpService, потому что константа поставщика, необходимая для его конструктора, не отображается (AXIOS_INSTANCE_TOKEN).

Итак, я создал свою собственную версию HttpModule и предоставил необходимая константа, чтобы моя служба могла расширить HttpService.

Вот мой код:

MyHttpModule:

export const AXIOS_INSTANCE_TOKEN = "AXIOS_INSTANCE_TOKEN";

@Module({
  providers: [
    ReadModelService,
    {
      provide: AXIOS_INSTANCE_TOKEN,
      useValue: Axios,
    },
  ],
  exports: [ReadModelService],
})
export class MyHttpModule {}

ReadModelService:

@Injectable()
export class ReadModelService extends HttpService {
  constructor() {
    const instance = Axios.create({
      baseURL: getReadModelApiUrl(),
    });
    addCamelizeInterceptors(instance);

    super(instance);
  }
}

Это позволяет мне использовать ReadModelService, как я бы использовал HttpService, но с перехватчиками baseURL и ax ios. Я также создал аналогичный сервис для WriteModelService и других. Я не уверен, что это лучшее возможное решение, но оно работает так, как задумано, и кода не требуется.

0 голосов
/ 14 июля 2020

Попробуйте добавить HttpService в providers: [] массив ReadModelModule

...