跳转至

HTTP module

Axios是广泛使用的功能丰富的 HTTP 客户端包。 Nest 封装 Axios 并通过内置的HttpModule公开它。 HttpModule导出HttpService类,该类公开了基于 axios 的方法来执行 HTTP 请求。 该库还将产生的 HTTP 响应转换为“可观察对象”。

Hint

你也可以直接使用任何通用的 Node.js HTTP 客户端库,包括gotundici

安装

要开始使用它,我们首先安装所需的依赖项。

$ npm i --save @nestjs/axios

开始

一旦安装过程完成,要使用HttpService,首先导入HttpModule

1
2
3
4
5
@Module({
  imports: [HttpModule],
  providers: [CatsService],
})
export class CatsModule {}

接下来,使用普通构造函数注入注入HttpService

Hint

HttpModuleHttpService是从@nestjs/axios包中导入的。

1
2
3
4
5
6
7
8
@Injectable()
export class CatsService {
  constructor(private httpService: HttpService) {}

  findAll(): Observable<AxiosResponse<Cat[]>> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}
@Injectable()
@Dependencies(HttpService)
export class CatsService {
  constructor(httpService) {
    this.httpService = httpService;
  }

  findAll() {
    return this.httpService.get('http://localhost:3000/cats');
  }
}

Hint

AxiosResponse是从axios包($ npm i axios)导出的接口。

所有的“HttpService”方法都返回一个包装在“Observable”对象中的“AxiosResponse”。

配置

Axios可以配置各种选项来定制HttpService的行为。 此处了解更多。 要配置底层的 Axios 实例,在导入它时将一个可选选项对象传递给HttpModuleregister()方法。 这个选项对象将直接传递给底层的 Axios 构造函数。

@Module({
  imports: [
    HttpModule.register({
      timeout: 5000,
      maxRedirects: 5,
    }),
  ],
  providers: [CatsService],
})
export class CatsModule {}

异步的配置

当您需要异步而不是静态地传递模块选项时,请使用registerAsync()方法。 与大多数动态模块一样,Nest 提供了几种处理异步配置的技术。

一种技术是使用工厂函数:

1
2
3
4
5
6
HttpModule.registerAsync({
  useFactory: () => ({
    timeout: 5000,
    maxRedirects: 5,
  }),
});

像其他工厂提供程序一样,我们的工厂函数可以是async,并且可以通过inject注入依赖项。

1
2
3
4
5
6
7
8
HttpModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    timeout: configService.getString('HTTP_TIMEOUT'),
    maxRedirects: configService.getString('HTTP_MAX_REDIRECTS'),
  }),
  inject: [ConfigService],
});

或者,你可以使用类而不是工厂来配置HttpModule,如下所示。

1
2
3
HttpModule.registerAsync({
  useClass: HttpConfigService,
});

上面的构造函数在HttpModule中实例化了HttpConfigService,用它来创建一个选项对象。 注意,在本例中,HttpConfigService必须实现如下所示的HttpModuleOptionsFactory接口。 HttpModule将对所提供类的实例化对象调用createHttpOptions()方法。

1
2
3
4
5
6
7
8
9
@Injectable()
class HttpConfigService implements HttpModuleOptionsFactory {
  createHttpOptions(): HttpModuleOptions {
    return {
      timeout: 5000,
      maxRedirects: 5,
    };
  }
}

如果你想重用现有的选项提供程序,而不是在HttpModule中创建私有副本,请使用useExisting语法。

1
2
3
4
HttpModule.registerAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
});

直接使用 Axios

如果你认为HttpModule.register的选项对你来说不够,或者如果你只想访问由@nestjs/axios创建的底层Axios实例,你可以通过以下方式HttpService#axiosRef访问它:

1
2
3
4
5
6
7
8
9
@Injectable()
export class CatsService {
  constructor(private readonly httpService: HttpService) {}

  findAll(): Promise<AxiosResponse<Cat[]>> {
    return this.httpService.axiosRef.get('http://localhost:3000/cats');
    //^ AxiosInstance interface
  }
}