Как создавать вложенные маршруты с параметрами с помощью NestJS

Мне нужно создать API, в котором большинство маршрутов имеют префикс общей части URL, которая также имеет параметр.

В моем конкретном случае мои маршруты должны выглядеть так:

/accounts/:account/resource1/:someParam

/accounts/:account/resource2/:someParam/whatever

/accounts/:account/resource3/

/accounts/:account/resource4/subResource/

и так далее..

Поэтому в идеале я бы создал родительский маршрут /accounts/:account/, который будет содержать дочерние маршруты (resource1, resource2, resource3, resource4 и т. д.).

Мне также нужно, чтобы параметр :account был доступен со всех дочерних маршрутов.

Каков наилучший способ добиться этого с помощью NestJS?


person Francesco Borzi    schedule 20.05.2018    source источник


Ответы (3)


Что касается вашего варианта использования, вы можете взглянуть на этот модуль маршрутизатора
=> https://github.com/shekohex/nest-router

Следуя документации этого модуля, вы можете определить свои маршруты следующим образом:

... //imports
const routes: Routes = [
    {
      path: '/ninja',
      module: NinjaModule,
      children: [
        {
          path: '/cats',
          module: CatsModule,
        },
        {
          path: '/dogs',
          module: DogsModule,
        },
      ],
    },
  ];

@Module({
  imports: [
      RouterModule.forRoutes(routes), // setup the routes
      CatsModule,
      DogsModule,
      NinjaModule
      ], // as usual, nothing new
})
export class ApplicationModule {}

Конечно, маршруты будут определены в отдельном файле, например routes.ts.

Учитывая тот факт, что у вас есть контроллер по модулям, предыдущий код заканчивался бы следующим деревом маршрутов:

ninja
    ├── /
    ├── /katana
    ├── cats
    │   ├── /
    │   └── /ketty
    ├── dogs
        ├── /
        └── /puppy


Пример:
Если вы хотите получить доступ к маршрутам контроллера ketty, вам потребуется достичь этой конечной точки:
<your-api-host>/ninja/cats/ketty

person A. Maitre    schedule 22.05.2018
comment
Я думаю, что это не отвечает этому требованию. Мне также нужно, чтобы параметр :account был доступен со всех дочерних маршрутов. - person Ambroise Rabier; 14.02.2019
comment
Ознакомьтесь с частью о вложенном маршруте: github.com/nestjsx/nest- router#params-in-nested-routes - person Maxime Lechevallier; 25.04.2020

Я думаю, вам это нужно?

import {Controller, Get, Param} from "@nestjs/common";

@Controller('accounts/:account')
export class TestController{

    @Get('resource2/:someParam/whatever')
    arsPW(@Param('account') account, @Param('someParam') someparam){
        console.log(':account/resource2/:someParam/whatever',account,someparam)
        return account+'_'+someparam+'___';
    }

    @Get('resource1/:someparam')
    aRSP(@Param('account') account, @Param('someparam') someparam){
        console.log(':account/resource1/:someParam',account,someparam)
        return account+'_'+someparam;
    }


    @Get()
    getget(){
        console.log('get');
        return 'aaa';
    }

}
person small white    schedule 21.05.2018
comment
это то, что я сейчас использую, но что, если у меня много дочерних маршрутов? Я не хочу иметь один толстый класс контроллера. В идеале я мог бы создавать разные дочерние маршруты внутри разных классов контроллеров. - person Francesco Borzi; 21.05.2018

Родительский контроллер:

@Controller('accounts')
export class AccountsController {
  // http://api.domaine.com/accounts
  @Get()

Детский контроллер:

@Controller('accounts/:id')
export class ResourcesController {
  // http://api.domaine.com/accounts/1/resources
  @Get('resources')
person Fadel    schedule 16.11.2019
comment
...и как тогда получить :id из второго примера? - person Paweł Lubczyński; 18.11.2020
comment
метод(@param('id') идентификатор) - person Yu Yenkan; 02.12.2020
comment
Это шаблон, который я использую, и он лучший из тех, что я видел, но он все еще не очень хорош для корпоративного API. Если вы затем хотите иметь /resources/:id, вам нужно определить еще один ResourcesController, возможно, переименовав тот, что выше, в AccountsResourcesController, чтобы создать «пробел». Хотелось бы, чтобы был механизм аннотирования метода класса, чтобы игнорировать/переопределять маршрут родительского контроллера. Если кто-нибудь заметит это и найдет лучший способ, пожалуйста, дайте мне знать! - person mikey; 21.06.2021