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

如何使用NestJS设置请求头?附现有代码示例

在NestJS中设置响应头的几种实用方法

嘿,我来帮你搞定NestJS里设置响应头的事儿!看你已经写了AuthController的基础代码,下面结合你的场景给你几种常用实现方式,按需选择就行:

方法1:通过@Res()操作Express Response对象(动态设置首选)

你代码里已经导入了@Res()和express.Response,这是最灵活的方式,特别适合动态生成头内容的场景(比如登录成功后把JWT写入Authorization头)。

补全你的@Post登录接口示例:

import { Controller, Body, Get, Post, HttpCode, HttpStatus, Req, Res } from '@nestjs/common';
import { Request, Response } from 'express';
import { AuthService } from './auth.service';
import { Usuario } from '../usuario/usuario.entity';
import { JsonWebTokenError } from 'jsonwebtoken';

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) { }

  @Post('login')
  @HttpCode(HttpStatus.OK)
  async login(
    @Body() loginDto: { username: string; password: string },
    @Res({ passthrough: true }) res: Response // 加passthrough让Nest继续自动处理响应
  ) {
    // 假设你的AuthService有验证用户和生成token的方法
    const user = await this.authService.validateUser(loginDto.username, loginDto.password);
    const token = await this.authService.generateToken(user);

    // 设置响应头:JWT放到Authorization里
    res.setHeader('Authorization', `Bearer ${token}`);
    // 也可以自定义业务相关的头
    res.setHeader('X-User-Id', user.id.toString());

    return { user, token }; // Nest会自动把这个返回值转为JSON响应
  }
}

划重点:如果只设置头、不需要手动发送响应,一定要加{ passthrough: true },否则Nest的自动响应处理会被跳过,得自己调用res.json()返回内容。

方法2:用@Header()装饰器设置静态头

如果你的响应头是固定值,直接用@Header()装饰器更简洁,不用操作Response对象:

@Get('profile')
@Header('Cache-Control', 'no-cache')
@Header('X-App-Version', 'v1.0.0')
async getProfile(@Req() req: Request) {
  const user = await this.authService.getUserFromToken(req.headers.authorization);
  return user;
}

方法3:拦截器实现全局/批量设置头

如果想给所有接口或者某一组接口统一添加响应头,自定义拦截器是最佳选择:

  1. 先创建拦截器文件:
// src/common/interceptors/global-header.interceptor.ts
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class GlobalHeaderInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const response = context.switchToHttp().getResponse();
    // 给所有响应统一加这些头
    response.setHeader('X-Powered-By', 'NestJS');
    response.setHeader('Access-Control-Expose-Headers', 'Authorization'); // 允许前端读取自定义头
    return next.handle();
  }
}
  1. 注册拦截器:
// 方式1:给AuthController单独用
@Controller('auth')
@UseInterceptors(GlobalHeaderInterceptor)
export class AuthController {
  // ... 你的代码
}

// 方式2:全局注册(所有接口生效)
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalInterceptors(new GlobalHeaderInterceptor());
  await app.listen(3000);
}

根据你的场景,登录接口用方法1最合适;如果是通用静态头,方法2或3会更高效。

内容的提问来源于stack exchange,提问作者Walter Armando Cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:28