NestJs - 如何获取处理程序的URL?

6

我希望将用户重定向到服务器上的另一个URL,但我不想像res.redirect('/hello_world')那样硬编码URL。相反,我只想指定特定控制器的处理程序URL,例如res.redirect(HelloWorldController.handlerName.url),其中HelloWorldController是指

@Controller()
export class HelloWorldController {
    @Get('hello_world')
    handlerName(): string {
        return 'Hello World!';
    }
}
1个回答

6
例如,您可以使用 Reflect 来获取元数据,如下所示:
import { PATH_METADATA } from '@nestjs/common/constants';

@Controller('api')
export class ApiController {
  @Get('hello')
  root() {
    let routePath = Reflect.getMetadata(PATH_METADATA, StaticController);
    routePath += '/' + Reflect.getMetadata(PATH_METADATA, StaticController.prototype.serveStatic);
    console.log(routePath); will return `api/hello`
    return {
      message: 'Hello World!',
    };
  }
}
  1. 我们获取api元数据
  2. 然后是它的方法

为什么它返回api/hello,如果我需要的不是自身url的路径,而是其他控制器的url?

这里以StaticController为例,您可以导入任何其他控制器并将其传递给Reflect.getMetadata(PATH_METADATA, AnyOtherController);


谢谢你的回答,但是有一些误解:第一 - 什么是PATH_METADATA?第二 - 如果我需要其他控制器的路径而非自身URL,为什么它会返回“api/hello”? - Nursultan Zarlyk
好的,我明白了。我们可以用“path”代替“PATH_METADATA”,然后获取指定控制器路径和方法路径的URL。不过,我认为NestJS会有一个帮助函数来返回完整路径,而不是自己创建它。非常感谢。 - Nursultan Zarlyk
@NursultanZarlyk,你也可以查看源代码中的NestJS实现: https://github.com/nestjs/nest/blob/91c879d9225d8c4ef125ca7f5e8ee555e9a0b872/packages/core/router/router-explorer.ts#L82-L92。这里有一些辅助函数。 - Yerkon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接