Node.js 当supertest调用异常csrfToken时,它不是一个函数

Node.js 当supertest调用异常csrfToken时,它不是一个函数,node.js,express,jestjs,nestjs,csrf,Node.js,Express,Jestjs,Nestjs,Csrf,我有一个带有CSRF保护的NestJS后端和一个获取CSRF令牌的端点。我得到了TypeError:req.csrfToken在使用jest和supertest测试此端点时不是函数 我的代码如下: // main.ts async function bootstrap() { const app = await NestFactory.create(AppModule); app.use(cookieParser()); app.use(csurf({ cookie: true }

我有一个带有CSRF保护的NestJS后端和一个获取CSRF令牌的端点。我得到了
TypeError:req.csrfToken在使用jestsupertest测试此端点时不是函数

我的代码如下:

// main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use(cookieParser());
  app.use(csurf({ cookie: true }));

  await app.listen(process.env.BACKEND_SERVER_PORT);
}

// authController.ts
import { Controller, Req, Get } from "@nestjs/common";
import { Request } from "express";
import * as AuthDto from "./modules/auth/dto/auth.dto";

@Controller("auth")
export class AppController {
  constructor() {}

  @Get("csrf")
  async getCsrfToken(@Req() req: Request): Promise<AuthDto.CsrfOutput> {
    return { csrfToken: req.csrfToken() };  // <-- ERROR HAPPENS HERE
  }
}

// app.controller.spec.ts
import { Test, TestingModule } from "@nestjs/testing";
import { INestApplication } from "@nestjs/common";
import request from "supertest";
import AppModule from "../src/app.module";

describe("AppController (e2e)", () => {
  let app: INestApplication;
  let server: any;

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

    app = moduleFixture.createNestApplication();
    await app.init();
    server = app.getHttpServer();
  });

  it("/csrf (GET)", () => {
    return request(server).get("/auth/csrf").expect(200).expect("hello");
    // I'll add more validations here once I get past this error
  });
});
//main.ts
异步函数引导(){
const app=wait NestFactory.create(AppModule);
使用(cookieParser());
使用(csurf({cookie:true}));
等待app.listen(process.env.BACKEND\u SERVER\u端口);
}
//authController.ts
从“@nestjs/common”导入{Controller,Req,Get}”;
从“express”导入{Request};
从“/modules/auth/dto/auth.dto”导入*作为AuthDto;
@控制器(“auth”)
导出类AppController{
构造函数(){}
@获取(“csrf”)
异步getCsrfToken(@Req()Req:Request):承诺{
返回{csrfToken:req.csrfToken()};//{
let-app:不适用;
让服务器:任意;
之前(异步()=>{
常量ModuleTexture:TestingModule=Wait Test.createTestingModule({
导入:[AppModule],
}).compile();
app=moduleTexture.createNestApplication();
等待app.init();
server=app.getHttpServer();
});
它(“/csrf(GET)”,()=>{
返回请求(server.get(“/auth/csrf”).expect(200.expect(“hello”);
//一旦通过此错误,我将在此处添加更多验证
});
});
我相信这可能与测试本身有关,因为当外部客户机(我们的前端应用程序或Postman)调用该端点时,该端点工作正常。它不适用于supertest


有人知道为什么吗?谢谢。

你只在
main.ts
中注册
csurf
,但是你的测试直接使用
AppModule
。AppModule本身不注册
csurf
。因此,当测试创建你的AppModule时,它没有必要的中间件。

就是这样。谢谢!