本文使用
@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
,就此解决问题。