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

如何在NestJS E2E测试中通过Jest和Supertest修改请求IP?

在NestJS E2E测试中为请求指定特定IP(Express环境)

下面是几种可行的解决方案,针对你遇到的默认IP无法修改的问题:

方法1:利用X-Forwarded-For/X-Real-IP请求头(推荐)

Express默认会优先识别X-Forwarded-For这类代理转发头来设置req.ip,但需要先配置NestJS信任代理:

  1. 在项目的main.ts中添加代理信任配置:
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 配置信任代理,让Express读取转发头中的IP
  app.set('trust proxy', true);
  await app.listen(3000);
}
bootstrap();
  1. 在E2E测试中,通过supertest的set方法设置目标IP:
import * as request from 'supertest';

describe('IP拦截器测试', () => {
  it('允许指定IP的请求', async () => {
    await request(app.getHttpServer())
      .get('/target-endpoint')
      .set('X-Forwarded-For', '192.168.1.100') // 替换为你需要的IP
      .expect(200);
  });
});

方法2:添加测试专用中间件修改req.ip

如果不想修改全局代理配置,可以在测试环境中注入自定义中间件,直接覆盖请求IP:

  1. 在测试文件的初始化环节添加中间件:
import { Test } from '@nestjs/testing';
import { AppModule } from '../src/app.module';

describe('IP拦截器测试', () => {
  let app: INestApplication;

  beforeEach(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    // 添加测试中间件,通过自定义头设置IP
    app.use((req, res, next) => {
      const testIp = req.headers['x-test-ip'];
      if (testIp) {
        req.ip = testIp as string;
      }
      next();
    });
    await app.init();
  });
});
  1. 测试时通过自定义头传递目标IP:
await request(app.getHttpServer())
  .post('/target-endpoint')
  .set('X-Test-IP', '10.0.0.5')
  .send({ data: 'test' })
  .expect(201);

为什么之前的方法无效?

  • jest.spyOn模拟req.ip失效:NestJS对Express请求对象有封装,拦截器读取req.ip的时机可能早于你的模拟操作,或者模拟未穿透到实际的请求对象实例。
  • app.set('Remote-Addr')无效:这不是Express的合法配置项,Express不会通过该设置修改请求IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:02:56