Nestjs路由器中控制器如何拆分路由

Posted

技术标签:

【中文标题】Nestjs路由器中控制器如何拆分路由【英文标题】:How split routes by controllers in Nestjs router 【发布时间】:2019-12-12 06:04:00 【问题描述】:

我正在使用库nest-router,我想通过连接到控制器的许多文件或仅存储在控制器附近的文件来拆分路由器结构。 在 Angular 中,我可以在路由器定义中使用 loadChildren 并制作延迟加载模块。 我如何创建像 Angular 风格的路由器结构?或者只是通过子路由分隔路由器文件?

const routes: Routes = [
    
      path: '/ninja',
      module: NinjaModule,
      childrens: NinjaRouterModule // <- like here
    ,
  ];

在 NinjaRouterModule 中

const routes: Routes = [
        
          path: '/cats',
          module: CatsModule,
        ,
        
          path: '/dogs',
          module: DogsModule,
          childrens: DogsRouterModule // <-like here
        
  ];

【问题讨论】:

那行得通,事实上children 数组只是另一个Routes 对象,所以这是一个有效的结构,我看不出有什么理由不适合你!跨度> @ShadyKhalifa 如何将路由导入到 NinjaRouterModule? imports: [ RouterModule.forRoutes(routes),...], exports: [RouterModule] ? 路由应该在 RootModule(又名 AppModule)中注册一次,另一方面,您可以在不同的文件或模块之间拆分 routes.ts 文件。 @Gopard,你能发布这个问题的官方答案吗? @JWess 我还是没有解决办法 【参考方案1】:

您需要在主模块(AppModule)中导入所有子路由以及RouterModule.register

@Module(
  imports: [
    NinjaRouterModule,
    CatsModule,
    DogsModule,
    DogsRouterModule,
    RouterModule.register(routes),
  ],

【讨论】:

【参考方案2】:

我不认为你想延迟加载路由服务器端,因为加载逻辑不一样。

在客户端,您希望尽可能快地显示主页并在用户访问 webapp 时加载其他页面(延迟加载)

在服务器中,您希望在启动时加载所有内容,以便在服务器初始化后能够尽可能快地响应,而不必(尽可能多地)加载外部资源。

所以,我认为正是出于这个原因,在 NestJS 中,可以在根模块中只加载一次路由,但没有什么能阻止您使用经典的导出/导入将路由外部化到另一个文件中。

就我个人而言,我在我的应用中使用这种结构:

ninja/
   cat/
       cat.module.ts
    dog/
       dog.module.ts
    ninja.module.ts
    ninja.routes.ts
    index.ts
app.module.ts
app.routes.ts

在 app.routes.ts 中

imports ninjaRoutes, NinjaModule from './ninja';

export const appRoutes: Routes = [
  
    path: 'ninja',
    module: NinjaModule,
    childrens: ninjaRoutes
  ,
];

in ninja.routes.ts

import  CatModule  from './cat/cat.module';
import  DogModule  from './dog/dog.module';

export const ninjaRoutes = [
  
    path: 'cats',
    module: CatModule
  , 
    path: 'dogs',
    module: DogModule
  
];

in ninja/index.ts

export * from './ninja.module';
export * from './ninja.routes';

在 app.module.ts 中

import  Module  from '@nestjs/common';
import  RouterModule  from '@nestjs/core';
import  appRoutes  from './app.routes';
import  NinjaModule  from './ninja';

@Module(
  imports: [NinjaModule, RouterModule.register(appRoutes)]
  ...

【讨论】:

看起来像我要找的东西。让我试试 Nest.js v8 已于几天前发布,其中包含针对特定用例的延迟加载模块(主要是需要快速启动时间的无服务器应用程序):trilon.io/blog/…【参考方案3】:
NestJS 8x

import  Module  from '@nestjs/common'
import  RouterModule  from '@nestjs/core'

@Module(
  imports: [RouterModule.register([
    path: 'admin',
    module: AdminModule,
    children: [
      
        path: 'dashboard',
        module: DashboardpModule
      ,
      
        path: 'metrics',
        module: MetricsModule
      
    ]
  ])]
)

export default class AppModule 

https://docs.nestjs.com/recipes/router-module#router-module

【讨论】:

如何在单独的文件中移动子路由?

以上是关于Nestjs路由器中控制器如何拆分路由的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net core 3.1 中控制器和剃须刀页面之间的路由

如何在 Nestjs 上使用具有多个 dto 的一条路由?

如何在 NestJS 拦截器中获取处理程序路由(对于 Express 和 Fastify)

在 Golang 和 MongoDB 中将路由拆分为单独的包

ASP.NET Core知多少:路由重写及重定向

我在我的 nestJS 应用程序(使用 authGuard)中使用了 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?