Nest HTTP 模块
2025/3/7大约 1 分钟
Nest HTTP 模块
很多时候我们会需要调用第三方的 API,我们可能需要使用 HTTP 请求去调用,Nest 封装了 Axios 并通过内置的 HttpModule 提供访问 HTTP 模块。
使用 HTTP 模块
首先需要安装 axios 和 @nestjs/axios 模块。
npm install axios @nestjs/axiosHTTP 模块的类名为 HttpModule,它提供了一个 HttpService 的服务,该服务提供了 axios 的方法来处理 HTTP 请求,并且使用 Observable 的形式返回请求结果。
以 app.module.ts 为例,将 HttpModule 导入。
import { HttpModule } from "@nestjs/axios";
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
@Module({
imports: [HttpModule],
controllers: [AppController],
providers: [],
})
export class AppModule {}调整 app.service.ts,使用 HttpService 来发送 HTTP 请求。
import { HttpService } from "@nestjs/axios";
import { Injectable } from "@nestjs/common";
import { Observable } from "rxjs";
import { AxiosResponse } from "axios";
@Injectable()
export class AppService {
constructor(private readonly httpService: HttpService) {}
findAll(): Observable<AxiosResponse<any>> {
return this.httpService.get("https://api.github.com/users/octocat");
}
}默认 axios 配置
使用 HttpModule.register() 方法来配置 axios 的默认配置。
这里以 app.module.ts 为例,配置 axios 的默认配置。
import { HttpModule } from "@nestjs/axios";
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
@Module({
imports: [
HttpModule.register({
timeout: 5000,
maxRedirects: 5,
}),
],
controllers: [AppController],
providers: [],
})
export class AppModule {}使用环境变量
HttpModule 提供了 registerAsync 方法,通过这个方法可以添加依赖的提供者,并使用工厂函数将其值注入到 HttpModule 中,使用这种方式可以将配置的默认值带入。
这里我们在 .env 中添加环境变量。
HTTP_TIMEOUT=5000修改 app.module.ts,在 registerAsync 方法中导入 ConfigModule 并在 inject 中添加 ConfigService,然后在 useFactory 中使用 ConfigService 的 get 方法获取环境变量。
import { HttpModule } from "@nestjs/axios";
import { Module } from "@nestjs/common";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { AppController } from "./app.controller";
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
HttpModule.registerAsync({
imports: [ConfigModule],
useFactory: (config: ConfigService) => ({
timeout: config.get("HTTP_TIMEOUT"),
}),
inject: [ConfigService],
}),
],
controllers: [AppController],
providers: [],
})
export class AppModule {}