Nodejs NestJS 怎么实现依靠 URL 前缀 '/admin' 和 '/app' 分别挂载两个不同 Module 从而实现区分 api 合集的逻辑?

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

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 也有类似的需求,但都被关闭了和不可用

例如2018 年有 25 个👍的回答

// 需要改成这样
// 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 官方是不是不推荐这样弄?不然应该很容易实现的。


回到顶部