【发布时间】:2021-11-17 16:30:21
【问题描述】:
Cannot read set property of 'userId' of undefined 是 Express 框架中遇到的一个经典错误,此处的文档介绍了如何处理它,但是如何在 NestJS 应用程序中解决此问题?
【问题讨论】:
标签: nestjs
Cannot read set property of 'userId' of undefined 是 Express 框架中遇到的一个经典错误,此处的文档介绍了如何处理它,但是如何在 NestJS 应用程序中解决此问题?
【问题讨论】:
标签: nestjs
当您收到一条显示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('*');
}
}
这意味着我想在进入应用程序的每个传入请求上使用中间件。应该是这样的。
【讨论】: