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

NestJs中设置session的csrfToken时出现"Cannot set properties of undefined"错误如何解决?

解决"TypeError: Cannot set properties of undefined (setting 'csrfToken')"问题

问题根源

你在CsrfMiddleware内部直接调用session({...}),但这个调用只是创建了一个express-session中间件的实例,并没有执行它来处理请求。因此req.session根本没被初始化,自然是undefined,导致无法设置csrfToken。

解决方法

方式一:全局注册session中间件

在项目的main.ts中先注册express-session全局中间件,确保所有请求先经过session处理,再进入CsrfMiddleware:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as session from 'express-session';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  // 先初始化session中间件
  app.use(session({
    secret: 'my-secret',
    resave: false,
    saveUninitialized: false,
  }));
  
  await app.listen(3000);
}
bootstrap();

然后修改你的CsrfMiddleware,直接使用已初始化的req.session:

import { v4 as uuidv4 } from 'uuid';
import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class CsrfMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    req.session.csrfToken = uuidv4();
    // 其他逻辑
    next();
  }
}

方式二:在模块中按顺序注册中间件

如果不想使用全局中间件,可以在对应模块的configure方法中,按顺序注册session和CsrfMiddleware,确保session先执行:

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { CsrfMiddleware } from './csrf.middleware';
import * as session from 'express-session';

@Module({
  // 模块内部的控制器、提供者等
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(
        // 先注册session中间件
        session({
          secret: 'my-secret',
          resave: false,
          saveUninitialized: false,
        }),
        // 再注册CsrfMiddleware
        CsrfMiddleware
      )
      .forRoutes('*'); // 可指定特定路由,比如'api/*'
  }
}

关键说明

express-session是一个Express中间件,必须通过app.use()或者Nest的MiddlewareConsumer.apply()来让它处理请求,它才会在req上挂载session对象。直接调用session({...})不会产生任何请求处理效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:25:04