【问题标题】:Cannot set property 'userId' of undefined in session variable无法在会话变量中设置未定义的属性“userId”
【发布时间】:2021-11-17 16:30:21
【问题描述】:

Cannot read set property of 'userId' of undefined 是 Express 框架中遇到的一个经典错误,此处的文档介绍了如何处理它,但是如何在 NestJS 应用程序中解决此问题?

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    当您收到一条显示Cannot set property 'userId' of undefined 的错误消息时,您想查看您的 cookie-session 发生了什么。

    您是否安装了 cookie 会话?

    每当您尝试在用户的会话对象上设置用户 ID 属性时都会引发错误,因为该 cookie 中间件未安装或未运行,您会得到未定义。

    因此,当您尝试在 undefined 上设置属性时,您会收到此经典错误消息。

    所以你的 cookie-session 可能没有设置。

    在一个普通的 ExpressJS API 中给出了足够的答案,但是如果你使用的是 NestJS 呢?嗯,这是解决这个问题的 NestJS 方法。

    将以下内容导入您的app.module.ts 文件:

    import { Module, ValidationPipe } from '@nestjs/common';
    import { APP_PIPE } from '@nestjs/core';
    

    转到您的提供者列表和数组内部以及一个全新的对象:

    providers: [
        AppService,
        {
          provide: APP_PIPE,
          useValue: new ValidationPipe({
            whitelist: true,
          }),
        },
      ],
    

    那么这到底有什么作用呢?它说每当我们创建应用程序模块的实例时,都会自动使用它。将其应用于流向应用程序的每个传入请求,通过类的实例运行它。全局管道就是这样设置的,但是你得把cookie会话中间件设置成全局中间件。

    您需要将以下内容导入到同一个文件中:

    import { MiddlewareConsumer, Module, ValidationPipe } from '@nestjs/common';
    

    在底部,添加以下内容:

    export class AppModule {
      configure(consumer: MiddlewareConsumer) {}
    }
    

    只要应用程序开始侦听传入流量,就会自动调用配置函数。所以在这里我可以设置一些中间件,这些中间件将在每个传入的请求上运行。

    为此,我们调用或引用consumer.apply(),如下所示:

    export class AppModule {
      configure(consumer: MiddlewareConsumer) {
        consumer.apply(
          cookieSession({
            keys: ['dfghjkl'],
          }),
        );
      }
    }
    

    然后我需要确保在顶部添加 cookie 会话的 require 语句:

    const cookieSession = require('cookie-session');
    

    并在底部添加:

    export class AppModule {
      configure(consumer: MiddlewareConsumer) {
        consumer
          .apply(
            cookieSession({
              keys: ['dfghjkl'],
            }),
          )
          .forRoutes('*');
      }
    }
    

    这意味着我想在进入应用程序的每个传入请求上使用中间件。应该是这样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      相关资源
      最近更新 更多