NestJS Fetch for Catalist Finance projects. Part of Catalist NestJS Modules
The module is based on the node-fetch package.
yarn add @catalist-nestjs/fetch
// Import
import { Module } from '@nestjs/common';
import { FetchModule } from '@catalist-nestjs/fetch';
import { MyService } from './my.service';
@Module({
imports: [FetchModule.forFeature()],
providers: [MyService],
exports: [MyService],
})
export class MyModule {}
// Usage
import { FetchService } from '@catalist-nestjs/fetch';
export class MyService {
constructor(private fetchService: FetchService) {}
async myFetch() {
return await this.fetchService.fetchJson('/url');
}
}
The fetchService
provides 2 methods: fetchJson
and fetchText
, which are based on a call to the fetch
function followed by a call to .json()
or .text()
. Method arguments are compatible with the fetch
.
import { Module } from '@nestjs/common';
import { FetchModule } from '@catalist-nestjs/fetch';
@Module({
imports: [FetchModule.forRoot()],
})
export class MyModule {}
import { Module } from '@nestjs/common';
import { FetchModule } from '@catalist-nestjs/fetch';
import { ConfigModule, ConfigService } from './my.service';
@Module({
imports: [
ConfigModule,
FetchModule.forRootAsync({
async useFactory(configService: ConfigService) {
return { baseUrls: configService.baseUrls };
},
inject: [ConfigService],
}),
],
})
export class MyModule {}
The forRoot
and forFeature
methods have the same options:
export interface FetchModuleOptions {
baseUrls?: string[];
retryPolicy?: RequestRetryPolicy;
}
export interface RequestRetryPolicy {
delay?: number;
attempts?: number;
}
Option | Default | Desc |
---|---|---|
baseUrls | [] | Array of base API URLs |
delay | 1000 | Number of milliseconds between attempts |
attempts | 0 | Number of times the query is retried |
// Import
import { Module } from '@nestjs/common';
import { FetchModule } from '@catalist-nestjs/fetch';
import { MyService } from './my.service';
@Module({
imports: [
FetchModule.forFeature({
baseUrls: ['https://my-api.com', 'https://my-fallback-api.com'],
retryPolicy: {
delay: 2000,
attempts: 3,
},
}),
],
providers: [MyService],
exports: [MyService],
})
export class MyModule {}
// Usage
import { FetchService } from '@catalist-nestjs/fetch';
export class MyService {
constructor(private fetchService: FetchService) {}
async myFetch() {
return await this.fetchService.fetchJson('/foo');
}
}
If the provided API services are unavailable, the following happens:
- request to https://my-api.com/foo
- 2000 ms delay
- request to https://my-fallback-api.com/foo
- 2000 ms delay
- request to https://my-api.com/foo
- throw exception
The retryPolicy
for each query can be rewritten:
import { FetchService } from '@catalist-nestjs/fetch';
export class MyService {
constructor(private fetchService: FetchService) {}
async myFetch() {
return await this.fetchService.fetchJson('/foo', {
retryPolicy: {
delay: 2000,
attempts: 3,
},
});
}
}