You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS:如何在控制器方法中获取主机名?

在NestJS控制器中获取当前主机名的方法

你遇到的问题是因为NestJS通过@Req()注入的是Node.js原生的http.IncomingRequest对象,它的headers是普通JS对象,而非浏览器环境中的Headers接口,所以没有get()方法,直接通过属性访问即可。

以下是几种可行的实现方式:

  • 直接从请求头获取完整主机(含端口)
    直接访问req.headers.host就能拿到包含主机名和端口的完整值,比如本地环境的localhost:3000或生产环境的your-domain.com:

    async find(@Param('uuid') uuid: string, @Req() req: Request): Promise<BlogDto> {
      const fullHost = req.headers.host;
      console.log(fullHost); // 输出示例: localhost:3000
      // 业务逻辑...
    }
    
  • 单独提取主机名(不含端口)
    如果只需要主机名部分,可以对host值进行拆分:

    async find(@Param('uuid') uuid: string, @Req() req: Request): Promise<BlogDto> {
      const hostName = req.headers.host.split(':')[0];
      console.log(hostName); // 输出示例: localhost
      // 业务逻辑...
    }
    
  • 使用@HostParam()装饰器(多域名场景适用)
    如果你需要基于主机名做路由匹配,可以先在模块或路由上配置主机模板,再通过@HostParam()直接获取主机名:

    1. 在模块中配置主机模板:
      @Module({
        controllers: [BlogController],
        // 配置主机模板,:host 是占位符
        host: ':host',
      })
      export class AppModule {}
      
    2. 在控制器中获取:
      async find(@Param('uuid') uuid: string, @HostParam('host') hostName: string): Promise<BlogDto> {
        console.log(hostName); // 输出示例: localhost
        // 业务逻辑...
      }
      

内容的提问来源于stack exchange,提问作者delete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:12:39