【问题标题】:How split routes by controllers in Nestjs routerNestjs路由器中控制器如何拆分路由
【发布时间】: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 我还是没有解决办法

标签: javascript node.js typescript express nestjs


【解决方案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

    【讨论】:

    • 如何在单独的文件中移动子路由?
    猜你喜欢
    • 2021-02-27
    • 2022-10-15
    • 1970-01-01
    • 2016-07-12
    • 2020-05-06
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多