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
相关产品推荐
相关产品推荐

