如何使用Redis作为Express Session的存储



我正在使用NestJS创建一个API,并试图为我的快速会话设置会话存储,但我从这行得到一个错误。我确实在一个新项目上使用express-session与Redis,我只是使用express预先了解Redis和express会话是如何工作的,但是当我试图将它移植到NestJS时,它没有工作。

Main.ts

import connectRedis from 'connect-redis';
import { redis } from './redis';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const RedisStore = connectRedis(session);

这是我得到的错误

const RedisStore = connectRedis(session);
^
TypeError: connect_redis_1.default is not a function

错误发生在任何其他redis相关的特性或express-session被调用之前。我仍然会包括我如何设置Redis &如果需要,可以使用Express-Session。

Redis.ts

import Redis from 'ioredis';
export const redis = new Redis(
port,
'hostName',
{ password: 'password' },
);

Session Inside of Main.ts

app.use(
session({
store: new RedisStore({ client: redis }),
cookie: {
maxAge: 60000 * 60 * 24,
},
secret: 'mysecret',
saveUninitialized: false,
resave: false,
}),
);

我确实从NestJS文档中读到我可以将Redis设置为微服务,但是我真的只需要Redis用于我的Express-Session,如果我能得到这个修复,我不想设置Redis微服务。

我还使用Mongoose连接到我的MongoDB,这是我在NestJS内部使用的存储库。以前在其他项目中,而不是使用Redis,我会使用ORMSession在TypeORM中设置我的存储,如果有人有与Mongoose一起工作的替代方案,那么这也可以工作。

const sessionRepo = getRepository(TypeORMSession);
...
store: new TypeormStore().connect(sessionRepo),

错误说明如下:connect_redis1.default不是一个函数

应该使用import * as connectRedis from 'connect-redis'。我这里有一个例子,看起来像这样:

import { Inject, Logger, MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import * as RedisStore from 'connect-redis';
import * as session from 'express-session';
import { session as passportSession, initialize as passportInitialize } from 'passport';
import { RedisClient } from 'redis';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth';
import { REDIS, RedisModule } from './redis';
@Module({
imports: [AuthModule, RedisModule],
providers: [AppService, Logger],
controllers: [AppController],
})
export class AppModule implements NestModule {
constructor(@Inject(REDIS) private readonly redis: RedisClient) {}
configure(consumer: MiddlewareConsumer) {
consumer
.apply(
session({
store: new (RedisStore(session))({ client: this.redis, logErrors: true }),
saveUninitialized: false,
secret: 'sup3rs3cr3t',
resave: false,
cookie: {
sameSite: true,
httpOnly: false,
maxAge: 60000,
},
}),
passportInitialize(),
passportSession(),
)
.forRoutes('*');
}
}

你需要安装@types/connect-redis

import * as _connectRedis from 'connect-redis';

如果您使用的是^7.1.0connect-redis版本,您应该使用:

const RedisStore = require("connect-redis").default

我调试了几个小时后,它对我有效。

最新更新