redis 连接时冻结节点服务器

Jou*_*Man 4 redis node.js express

我正在尝试使用 redis 来存储带有快速会话的会话。这是代码:

//Imports
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const session = require('express-session');
const logger = require('morgan');

//Connect to Redis
const redis = require('redis');
let RedisStore = require('connect-redis')(session);
let redisClient = redis.createClient();
redisClient.connect();
redisClient.on('connect', () => console.log('Connected to Redis..'));

app.use(
  session({
    store: new RedisStore({ client: redisClient }),
    saveUninitialized: false,
    secret: 'keyboard cat',
    resave: false,
  })
);

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(logger('dev'));

app.get('/', function (req, res) {
  var body = '';
  console.log(req.session);
  if (req.session.views) {
    ++req.session.views;
  } else {
    req.session.views = 1;
    body += '<p>First time visiting? view this page in several browsers :)</p>';
  }
  res.send(
    body + '<p>viewed <strong>' + req.session.views + '</strong> times.</p>'
  );
});

app.listen(3000, () => console.log('App is listening on port 3000'));
Run Code Online (Sandbox Code Playgroud)

每当我启动我的应用程序时,它就会冻结。我已经检查了 redis-cli 并用响应“PONG”对其进行了 ping 操作。redis-server 启动得很好。每当我删除以下行时:

redisClient.connect();
redisClient.on('connect', () => console.log('Connected to Redis..'));
Run Code Online (Sandbox Code Playgroud)

每当我点击“/”路线时,应用程序就会崩溃。但如果我输入了这些行,应用程序就会挂在那里并且不执行任何操作。我在这里检查了文档,他们说您需要在执行任何命令之前进行连接:

https://github.com/redis/node-redis/blob/HEAD/docs/v3-to-v4.md#no-auto-connect

我正在运行的代码就来自 connect-redis npm 页面:

https://www.npmjs.com/package/connect-redis

我不知道为什么服务器冻结了。如果我从会话中删除存储,它就可以正常工作,因此这肯定与 redis 有关,但在节点端。Redis 服务器在本地主机上运行良好。有什么建议么?

**更新

我检查了 connect-redis 存储库问题,发现其他人也遇到了与我相同的问题。该问题将在下次提交中解决:

https://github.com/tj/connect-redis/issues/336

Jou*_*Man 10

目前这是一个已知问题。目前connect-redis与最新版本的node redis不兼容。 https://github.com/tj/connect-redis/issues/336

将以下内容添加到您的客户端以修复此问题,直至修补:

const client = createClient({
    legacyMode: true
});
Run Code Online (Sandbox Code Playgroud)

  • 2022 年 8 月,我的情况仍然如此。 (3认同)