我正在使用expressconnect-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客户端缺少hostport参数。 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 });
}

10-04 20:30