如何在 NestJS 的控制器路由中获取配置?

How to get config in controller route of NestJS?

我试图让一个变量通过装饰器的控制器 prefix 和方法 path 参数出现。我知道 Nest Router,但我宁愿尽可能避免使用它。

/*************************
* eneity.config.ts
*************************/
import { registerAs } from '@nestjs/config';
export default registerAs('cat', () => ({
        cat: {
            urlPrefix: 'cat',
            paramName: 'meow',
        }
    })
);
/*************************
* cat.module.ts
*************************/
import entityConfig                    from 'config/entity.config';
import { CatController }               from 'entities/cat/cat.controller';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
            imports    : [ConfigModule.forFeature(entityConfig),],
            providers  : [ConfigService],
            controllers: [CatController],
        })
export class CatModule {}

/*************************
* cat.controller.ts
*************************/

import { Controller, Request, Get } from '@nestjs/common';
import { ConfigService }            from '@nestjs/config';

@Controller(`${this.urlPrefix}/cat`) // <<<<< Here
export class CatController {
    private readonly urlPrefix;
    private readonly paramName;

    constructor(
        private readonly configService: ConfigService,
    ) {
        this.urlPrefix = this.configService.get<string>('cat.urlPrefix'); // animal
        this.paramName = this.configService.get<string>('cat.paramName'); // meow
    }

    @Get(`snowflake/:${this.paramName}`) // <<<<< Here
    getProfile(@Request() req) {
        return 'meowww';
    }
}

我试着照原样做,它一直给我 "undefined",即使如果我将它记录到构造函数中的控制台,它也会显示。我希望能够使用配置来设置这些常量。

最终我想要的路线是:localhost/animal/cat/snowflake/meow.


编辑:我用普通变量尝试过,它起作用了。显然问题出在我对 NestJS 的配置包的实现上。

您的配置服务没有问题,但装饰器在 Typescript/JavaScript 中的工作方式存在问题。由于装饰器上下文的工作方式,装饰器无法访问 class 成员。如果你想让端点可配置,一开始这似乎是个坏主意,你可以像你提到的那样使用 nest-router