You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Redis作为express-session存储时Node服务器冻结问题求助

问题:Express结合connect-redis存储会话时服务无响应

我尝试使用Redis配合express-session存储会话信息,代码如下:

//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>首次访问?可以用多个浏览器打开当前页面测试哦 :)</p>';
  }
  res.send(
    body + '<p>已访问 <strong>' + req.session.views + '</strong> 次</p>'
  );
});

app.listen(3000, () => console.log('App is listening on port 3000'));

启动应用后服务直接冻结无响应,我已通过redis-cli执行ping命令得到PONG响应,确认redis-server运行正常。如果我移除以下两行代码:

redisClient.connect();
redisClient.on('connect', () => console.log('Connected to Redis..'));

访问"/"路由时应用会直接崩溃;保留这两行的话服务就会持续挂起无任何响应。我查阅了对应官方文档,说明执行命令前需要先手动调用connect方法,且我使用的代码完全来自connect-redis的npm官方文档。
目前可以确认如果移除session配置中的store参数服务就可以正常运行,问题肯定出在Node侧的Redis相关配置上,但本地Redis服务运行正常,想请教大家该问题该如何排查解决?

问题更新

我查看了connect-redis仓库的Issue,发现有其他用户也遇到了相同问题,该问题会在后续的代码提交中修复。


解决方案

这个问题是node-redis v4版本和旧版connect-redis的API不兼容导致的:node-redis v4默认返回Promise,而旧版connect-redis调用Redis客户端时用的是回调语法,两者对接不上就会导致请求挂起。你可以选择以下任意一种方案解决:

  • 方案1:降级node-redis到v3版本
    v3版本的node-redis默认使用回调语法、自动连接,不需要手动调用connect()方法,和当前版本的connect-redis完全适配。执行以下命令安装即可:
    npm install redis@3
    之后删除代码中的redisClient.connect()行,直接运行服务就能正常工作。
  • 方案2:开启node-redis的兼容模式
    如果你需要使用node-redis v4的新特性,只需要在创建客户端时开启legacy模式即可兼容旧回调语法:
let redisClient = redis.createClient({
  legacyMode: true
});
// 注意添加catch捕获连接异常,避免服务崩溃
redisClient.connect().catch(console.error);

修改后重启服务即可正常响应请求。


内容的提问来源于stack exchange,提问作者Journey_Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:24:04