nestjs响应头header入门到精通
一、@Header()基础用法
作用:设置 HTTP 响应头(Response Headers),常用于指定内容类型、缓存策略或自定义头信息。
1. 静态头部设置
import { Controller, Get, Header } from '@nestjs/common';
@Controller('example')
export class ExampleController {
@Get('static')
@Header('Content-Type', 'application/json')
@Header('Cache-Control', 'no-cache')
getStatic() {
return { message: 'Static headers' };
}
}
响应头:
Content-Type: application/json Cache-Control: no-cache
2. 动态头部值
通过工厂函数动态生成头部值:
@Get('dynamic')
@Header('X-Request-Time', (req) => Date.now().toString())
getDynamic() {
return { message: 'Dynamic headers' };
}
二、进阶技巧与注意事项
1. 与@Res()对象结合
若需手动操作响应对象(如文件下载),需显式注入 @Res():
import { Response } from 'express';
@Get('manual')
getManual(@Res() res: Response) {
res.set('X-Custom-Header', 'value');
res.send({ data: 'Manual headers' });
}
注意:使用 @Res() 后,NestJS 的自动响应管理会失效,需手动处理响应。
2. 装饰器执行顺序
多个装饰器的执行顺序影响最终结果:
@Get('order')
@Header('A', '1')
@Header('B', '2')
getOrder() {
return {};
}
响应头:
A: 1
B: 2
3. 覆盖默认行为
NestJS 默认设置 Content-Type: application/json,可通过 @Header() 覆盖:
@Get('override')
@Header('Content-Type', 'text/plain')
getOverride() {
return 'Plain text response';
}
三、底层原理与框架差异
1. 底层适配机制
- Express:直接调用 response.setHeader()。
- Fastify:通过 reply.header() 设置,需注意 Fastify 的头名称大小写不敏感。
2. 与中间件的交互
全局中间件设置的头部可能被控制器中的 @Header() 覆盖,需注意优先级。
四、常见问题与解决方案
1. 头部未生效
- 原因:使用了 @Res() 但未正确操作响应对象。
- 解决:确保在手动操作响应时调用 res.send() 或 res.end()。
2. 动态值依赖服务
通过依赖注入获取服务数据:
@Get('service-data')
@Header('X-Version', (req, res, next) => {
const appVersion = req.app.get('APP_VERSION');
return appVersion;
})
getServiceData() {
return { version: '1.0.0' };
}
五、最佳实践
1. 统一头部管理
使用拦截器全局设置公共头部:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
@Injectable()
export class HeadersInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
const response = context.switchToHttp().getResponse();
response.setHeader('X-Powered-By', 'NestJS');
return next.handle();
}
}
2. 安全头部配置
推荐设置安全相关头部:
@Get('secure')
@Header('Content-Security-Policy', "default-src 'self'")
@Header('X-Content-Type-Options', 'nosniff')
getSecure() {
return { data: 'Secure headers' };
}
六、性能优化建议
- 避免重复设置:在拦截器中设置公共头部,减少控制器冗余代码。
- 条件性头部:根据请求参数动态决定是否设置头部:
@Get('conditional')
@Header('X-Conditional', (req) => req.query.debug ? 'true' : 'false')
getConditional() {
return { debugMode: !!req.query.debug };
}
通过合理使用 @Header() 装饰器,您可以精确控制 API 的响应行为,同时保持代码的可维护性。建议结合拦截器和全局中间件实现复杂的头部管理逻辑。
到此这篇关于nestjs响应头header入门到精通的文章就介绍到这了,更多相关nestjs响应头header内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
JavaScript 使用 splice 方法删除数组元素可能导致的问题分析
这篇文章主要介绍了JavaScript 使用 splice 方法删除数组元素可能导致的问题分析,当在 JavaScript 中从数组中删除元素时,使用 splice 方法时需要谨慎,本文给大家详细讲解,需要的朋友可以参考下2023-04-04


最新评论