我正在使用express
和connect-redis
来使服务器将Redis用于 session 。
import Session from 'express-session';
const session = Session({
resave: true,
saveUninitialized: true,
key: '...',
secret: '...',
store: initializeRedis(Session);
});
Redis初始化程序如下所示:
import { createClient as createRedisClient } from 'redis';
import connectRedis from 'connect-redis';
export default function initializeRedis(Session) {
const redisClient = createRedisClient();
const RedisStore = connectRedis(Session);
return new RedisStore({
host: 'redis',
port: 6378,
});
}
根据先前的option parameters,服务器应该通过端口
redis
而不是默认的127.0.0.1
连接到6378
而不是默认的6379
。但是,不管这些值等于什么,我总是得到相同的输出:
我在配置过程中错过了什么吗?
最佳答案
TL; DR
Redis客户端缺少host
和port
参数。 RedisStore
内没有客户端。
const redisClient = createRedisClient({
host: 'redis',
port: 6379
});
return new RedisStore({
client: redisClient,
});
如果对其他人有用,则在文章末尾提供完整的可复制粘贴的代码。
完整版本
有两种方法可以解决上面的代码。
1.
const redisClient = createRedisClient()
没有分配给,但是它仍在进行连接。因此,服务器由于无法连接而崩溃,但这不是RedisStore
故障。当我发布问题时,我没有注意到那条线,而且我认为这条线由于商店而崩溃了。
实际上,没有那行就行了,因为RedisStore has a default client implementation。
return new RedisStore({
host: 'redis',
port: 6379,
});
2. redis客户端缺少主机和端口自定义值(默认值为
'127.0.0.1'
和6379
) import { createClient as createRedisClient } from 'redis';
const redisClient = createRedisClient({
host: 'redis',
port: 6379
});
如果我们使用特定的客户端实现,则将其传递给
RedisStore
也很有意义: const RedisStore = connectRedis(Session);
return new RedisStore({
client: redisClient,
});
完整的外卖代码
server.js
import Session from 'express-session';
import initializeRedis from './redis';
// Initialize session.
const session = Session({
resave: true,
saveUninitialized: true,
key: 'SID',
secret: 'Luke Skywalker',
store: initializeRedis(Session)
});
app.use(session);
redis.js
import { createClient as createRedisClient } from 'redis';
import connectRedis from 'connect-redis';
export default function initializeRedis(Session) {
const redisClient = createRedisClient({
host: 'redis', // or '127.0.0.1'.
port: 6379,
});
const RedisStore = connectRedis(Session);
return new RedisStore({ client: redisClient });
}