Nodejs NestJS 怎么实现依靠 URL 前缀 '/admin' 和 '/app' 分别挂载两个不同 Module 从而实现区分 api 合集的逻辑?
Nodejs NestJS 怎么实现依靠 URL 前缀 ‘/admin’ 和 ‘/app’ 分别挂载两个不同 Module 从而实现区分 api 合集的逻辑?
目前的 NestJS 项目文件夹结构
libs 中的
- admin 是管理后台的 api 集合
- app 是 app 客户端的 api 集合
- db 是 admin 和 app 共用的 Sequelize 数据库的模型,Sequelize 对象的初始化在 db 里的 db.moudle.ts(admin 和 app 都会初始化一次,感觉很不爽)
// main.js
async function bootstrap () {
const admin = await NestFactory.create(AdminModule)
const app = await NestFactory.create(AppModule)
await Promise.all([
admin.init(),
app.init(),
])
await Promise.all([
admin.listen(3000),
app.listen(3001),
])
}
- 目前只能通过启动两个不同端口的 Nest Application 来实现这个需求(需要再用 Nginx 做 url 路径的反代)
- 有好有不好吧
- 好处是两个独立的 app 其中一个崩了也互不影响
- 不好的地方是开发时每次 reload 后两个 app 需要重新同步数据库两次,不够完美
发帖前也搜过这个需求,nestjs 的 github issue 也有类似的需求,但都被关闭了和不可用
// 需要改成这样
// main.ts
async function bootstrap () {
const server = express()
const appFactory = new NestFactoryStatic()
const app = await apiFactory.create(AppModule, new ExpressAdapter(server))
app.setGlobalPrefix(’/app’)
await app.init()
const adminFactory = new NestFactoryStatic()
const admin = await adminFactory.create(AdminModule, new ExpressAdapter(server))
admin.setGlobalPrefix(’/admin’)
await admin.init()
http.createServer(server).listen(3000)
}
我尝试过了,admin 会覆盖掉 app 的路由,失败
搜到一个nest-router,但最后 commit 是 12 个月前,我就没尝试
有没有 NestJS 大佬指教一下该怎么实现
nestjs 官方是不是不推荐这样弄?不然应该很容易实现的。