在nodejs项目报错:CROSSSLOT Keys in request don't hash to the same slot解决方法

本文介绍了在Node.js Express应用中遇到CROSSSLOT错误的原因和解决方案,特别是在使用Redis集群作为session存储时。通过引入'ioredis'库支持集群模式,并在配置中设置keyPrefix来确保所有session键位于同一槽位,从而避免错误。同时,展示了如何配置和检查session存储的键值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于后台用的是redis集群,我前端刚好碰巧用的是nodejs express框架。express存储session有自己的机制。本来单独的redis主模式是很好用redis保存session的,但奈何用了集群分片模式~~。
下面是当后台使用redis分片模式时候,前端存储session连接redis的写法。主要的部分代码:

var session = require(‘express-session’);
var connectRedis = require(‘connect-redis’);
var Redis = require(‘ioredis’); //ioredis支持cluster模式,哨兵模式等,可以去看官方api
var RedisStore = connectRedis(session);
var cluster = new Redis.Cluster(
[{
port: 7001,
host: ‘132.21.1.31’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7001,
host: ‘132.22.1.31’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7002,
host: ‘132.21.1.34’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
},
{
port: 7002,
host: ‘132.21.1.34’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7001,
host: ‘132.21.1.21’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7002,
host: ‘122.21.1.21’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}],
{ keyPrefix: ‘{user}:’ }
);

app.use(session({
store: new RedisStore({client:cluster}),
resave:true,
saveUninitialized: true,
secret: ‘redis.hh’,
name: config.cookeId,
cookie: {
maxAge: 3600000 * 24 * 7
},
genid: function(req) {
var token = req.cookies.token;
var uid = ”;
if (token) {
uid = new Date().getTime() + “egJdkw” + token + uuid.v4();
} else {
uid = new Date().getTime() + “ewrecz” + uuid.v4();
}
return uid;
},
}));

注意,一定要加上 { keyPrefix: ‘{user}:’ }(ps:这个只是我自己的,按照记住想法写就行了,格式一样就好,字段自己设置),这样各个集合的key才能在redis集群中的同一个slot上,这样就不会报错了。(ps:上面的集群redis服务地址,我随便乱写的,换成自己后台给的就好。)。

  1. require(‘connect-redis’); 这个包可以里面的 RedisStore.prototype.set 这个方法 可以看到实际上存储在session里面的key的,输出一下,然后在客户端的redis查看就可以了:get {user}:sess:***********.redis存储session是以 sess开头的。这样就可以查看自己是不是存到数据库和session的destory了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值