经验分享
Nestjs添加接口前缀,针对module级别的请求前缀添加
本文使用 @nestjs/cli@9.x 初始化项目,nodejs版本16.18.0 1. 全局添加前缀在 src/main.ts 中,有一个 bootstrap 函数用来启动整个 nest 工程
2023-08-17 09:09:25
83

本文使用 @nestjs/cli@9.x 初始化项目,nodejs版本16.18.0

1. 全局添加前缀

src/main.ts 中,有一个 bootstrap 函数用来启动整个 nest 工程,通过如下代码设置全局请求前缀

// ...

async function bootstrap(){
  const app = await NestFactory.create(AppModule);

  // 全局接口前缀
  app.setGlobalPrefix("v1");

  //...
}

2. 针对 module 添加前缀

2.1 架构划分:

flowchart TD AppModule --> CommonModule AppModule --> ApiModule ApiModule --> UserModule CommonModule--> UserModule

graph LR UserModule --> UserController == /user/info ==> UserService

此时我想通过 /v1/user/info 访问接口,参照第一步设置全局前缀

若我想通过 /v1/api/user/info 访问 ApiModule 下的 /user/info 接口,又该怎么操作呢?

2.2 针对 module 局部前缀

2.2.1 首先在 ApiModule 中引入 UserControllerUserService

// ApiModule
import { Module, NestModule } from "@nestjs/common";
import { UserController } from "../common/user.module/user.controller";
import { UserService } from "../common/user.module/user.service";

@Module({
  imports:[],
  controllers: [UserController],
  providers: [UserService]
})
export class ApiModule implements NestModule {}

2.2.2 修改 AppModule

// AppModule
import { Module } from "@nestjs/common";
import { ApiModule } from "./modules/api/api.module";

@Module({
  imports: [
    // 注入ApiModule
    ApiModule,
    // path设置你的module前缀,module指向对应的Module
    RouterModule.register([
      { path:"api",module: ApiModule }
    ])
  ],
  controllers: [],
  providers: []
})
export class AppModule {}

3. 总结

因为这个问题,早上6点40左右起床研究,研究了一个小时,中午午休研究一个小时,两个小时没有一点思路,下午快下班突然灵感迸发,解决了,这里看一下NestJS英文文档
文档提到了 RouterModule.register,我也按照方式配了,始终没生效,原因是未在 ApiModule 中引入对应的 ControllerService,只是引了对应的 Module,而 Module 对于接口请求没有什么作用,接口请求走的是 Controller ,就此解决问题。