RedisStore 忽略主机和端口字段

RedisStore ignores host and port fields

我正在使用 expressconnect-redis 让服务器使用 Redis 进行会话。

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,服务器应该通过端口 6378 而不是默认的 6379 连接到 redis 而不是默认的 127.0.0.1 ]

但是,无论这些值等于多少,我总是得到相同的输出:

Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379

我在配置过程中遗漏了什么吗?

TL;DR

Redis 客户端缺少 hostport 参数。 RedisStore.

里面没有客户端
const redisClient = createRedisClient({
  host: 'redis',
  port: 6379
});

return new RedisStore({
  client: redisClient,
});

post 末尾的完整 copy-paste 可用代码,以防对其他人有用。

完整版

有几种方法可以解决上面的代码。

1. const redisClient = createRedisClient() 无处分配 ,但它仍在执行连接工作。因此,服务器因为无法连接而崩溃,但这不是 RedisStore 故障。

在我 post 提出问题时,我没有注意到那条线,我以为它是因为商店而崩溃。

事实上,没有那一行它也能工作,因为 RedisStore has a default client implementation.

or created for you using the host, port, or socket params.

  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 });
}