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()直接获取主机名:- 在模块中配置主机模板:
@Module({ controllers: [BlogController], // 配置主机模板,:host 是占位符 host: ':host', }) export class AppModule {} - 在控制器中获取:
async find(@Param('uuid') uuid: string, @HostParam('host') hostName: string): Promise<BlogDto> { console.log(hostName); // 输出示例: localhost // 业务逻辑... }
- 在模块中配置主机模板:
内容的提问来源于stack exchange,提问作者delete
相关产品推荐
相关产品推荐

