本文使用
@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 中引入 UserController 和 UserService
// 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 中引入对应的 Controller 和 Service,只是引了对应的 Module,而 Module 对于接口请求没有什么作用,接口请求走的是 Controller ,就此解决问题。