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

如何阻止NestJS修改响应头?解决Content-Type等相关问题

问题解答

1. 为何res.send后自动添加charset=utf-8?

Express(NestJS底层依赖)的res.send方法会自动处理响应头:当你设置的Content-Type未指定charset,且响应体被识别为文本类数据(比如字符串、非二进制Buffer)时,它会自动补全charset=utf-8。

你遇到的情况大概率是result.data并非纯二进制的WebP数据(比如是base64字符串、文本格式的二进制数据),导致res.send误判为文本类型,从而追加了charset。解决方法:

  • 确保result.data是Buffer或Uint8Array类型的二进制数据
  • 或者在调用res.send前,手动把响应头设置为image/webp; charset=utf-8(虽然图片类型不需要charset,但可以避免自动追加)
  • 也可以改用res.end(result.data)替代res.send,res.end不会自动修改响应头

2. 阻止NestJS修改X-Powered-By响应头

Express默认会自动添加X-Powered-By: Express,NestJS默认没有禁用这个行为。要自定义或移除该头,有两种方式:

  • 全局禁用并自定义:在main.ts中先禁用默认的头,再手动设置自定义值:
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      // 禁用Express默认的X-Powered-By
      app.disable('x-powered-by');
      // 手动设置自定义头
      app.use((req, res, next) => {
        res.setHeader('X-Powered-By', 'ImageX');
        next();
      });
      await app.listen(3000);
    }
    bootstrap();
    
  • 使用拦截器统一处理:创建一个响应拦截器,在发送响应前覆盖该头:
    import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
    import { Observable } from 'rxjs';
    import { tap } from 'rxjs/operators';
    
    @Injectable()
    export class CustomHeaderInterceptor implements NestInterceptor {
      intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        const response = context.switchToHttp().getResponse();
        return next.handle().pipe(
          tap(() => {
            response.setHeader('X-Powered-By', 'ImageX');
          }),
        );
      }
    }
    
    然后在模块或全局注册该拦截器即可。

补充:你尝试的res.socket没用是因为响应头的修改是在res.send的处理逻辑中发生的,而非底层socket层面,所以需要从Express/NestJS的响应处理流程入手。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:06:04