如何使用NestJS创建带参数的嵌套路由

时间:2018-05-20 20:14:48

标签: javascript node.js api typescript nestjs

我需要构建一个API,其中大多数路由都以一个公共URL部分作为前缀,该部分也有一个参数。

在我的具体情况中,我的路线需要看起来像:

/accounts/:account/resource1/:someParam

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

/accounts/:account/resource3/

/accounts/:account/resource4/subResource/

依旧......

理想情况下,我会创建路线/accounts/:account/,其中包含儿童路线(resource1resource2,{ {1}},resource3等等......)。

我还需要可以从所有子路径访问resource4参数。

使用NestJS实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

我认为你需要这个吗?

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';
    }

}

答案 1 :(得分:1)

关于您的用例,您可能需要查看此路由器模块
=> 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

答案 2 :(得分:1)

父控制器:

@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')