为什么我在 NestJs 中收到错误“无法设置未定义的属性”?

Why am I getting the error "Cannot set properties of undefined" in NestJs?

提问人:vladislav997 提问时间:11/16/2023 更新时间:11/17/2023 访问量:23

问:

我正在尝试在会话中设置csrfToken的值:

import { v4 as uuidv4 } from 'uuid';
import * as session from 'express-session';

@Injectable()
export class CsrfMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    session({
      secret: 'my-secret',
      resave: false,
      saveUninitialized: false,
    });
    req.session.csrfToken = uuidv4();
    // other logic
    next();
  }
}

但是我收到一个错误: “TypeError:无法设置 undefined 的属性(设置 'csrfToken')”

我该如何解决这个问题?

表示 nestjs

评论


答:

0赞 Jay McDoniel 11/17/2023 #1

session以这种方式调用不会修改对象。通常,在调用中间件时,您可以像 的方法一样或在 的情况下进行调用。reqapp.use(session(options))consumer.apply(options)NestModuleconfigure

要执行您要执行的操作,您需要将中间件称为

@Injectable()
export class CsrfMiddleware implements NestMiddleware {
  async use(req: any, res: any, next: () => void) {
    await new Promise((resolve, reject) => {
      session({
        secret: 'my-secret',
        resave: false,
        saveUninitialized: false,
      })(req, res, resolve);
    });
    req.session.csrfToken = uuidv4();
    // other logic
    next();
  }
}

或者,您需要让调用是一个单独的、以前称为中间件的。同样,您可以使用 in 或 方法sessionapp.use()main.tsconfigureNestModule


要做到这一点,你可以做如下的事情。NestModule

@Module({})
export class AppModule implements NestModule {

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(session(options), CsrfMiddleware).forRoutes('*');
  }
}

评论

0赞 vladislav997 11/17/2023
您能否就如何以 a 的方法做到这一点提供建议?configureNestModule