typescript - 如何在 NestJS 中创建多个 Axios 实例
问题描述
我正在将现有的 Express 应用程序转换为 NestJS,目前我有一个配置文件,我在其中为每个微服务创建多个 axios 实例:
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);
我想在nestjs中使用共享模块来复制它,目前我有这个:
- 读取模型模块
@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);
}
}
- 读取模型服务
@Injectable()
export class ReadModelService extends HttpService {}
但巢给了我一个错误说:
[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 */ ]
})
我真的不知道该怎么做。有人可以帮忙吗?
解决方案
为了将来参考,我最终做了一些 hack。我浏览了 NestJs 代码,发现目前无法扩展 HttpService,因为它的构造函数所需的提供程序常量没有公开(AXIOS_INSTANCE_TOKEN)。
因此,我创建了自己的 HttpModule 版本并提供了所需的常量,以便我的服务可以扩展 HttpService。
这是我的代码:
我的Http模块:
export const AXIOS_INSTANCE_TOKEN = "AXIOS_INSTANCE_TOKEN";
@Module({
providers: [
ReadModelService,
{
provide: AXIOS_INSTANCE_TOKEN,
useValue: Axios,
},
],
exports: [ReadModelService],
})
export class MyHttpModule {}
读取模型服务:
@Injectable()
export class ReadModelService extends HttpService {
constructor() {
const instance = Axios.create({
baseURL: getReadModelApiUrl(),
});
addCamelizeInterceptors(instance);
super(instance);
}
}
这使我可以像使用 HttpService 一样使用 ReadModelService,但使用 baseURL 和 axios 拦截器。我还为 WriteModelService 和其他人创建了一个类似的服务。我不确定这是可能的最佳解决方案,但它可以按预期工作,并且不需要太多代码。
推荐阅读
- swift - 当键盘出现时,选择导致视图向上滑动的原因
- c# - 从 .NET 核心项目引用 UWP 项目
- javascript - JSPDF 的 `html` 方法还有哪些其他选项可用
- laravel - Laravel 5(自定义)计算年龄(天)的方法不存在
- javascript - 代码在 .html 中运行良好,但在 blogspot.com 中却不行
- pandas - 需要以下查询的帮助
- dialogflow-es - 如何在 Google Home 智能显示屏上更改卡片标题的位置
- bash - 如何增加文本中的数字
- firebase - 如何将一组数据类型放入 Firestore?
- sql - 获取多边形的子/父关系