Redis Cloud和connect-redis:客户端关闭
Redis Cloud and connect-redis: the client is closed
我目前使用Express搭建网站,想使用redis云数据库在session中保存userID。 redisClient 在 redisClient.js 中创建,之后我将它传递给 app.js 会话中的 redisStore。这是代码:
redisCLient.js
const redis = require("redis");
let redisClient = redis.createClient({
host: process.env.REDIS_HOSTNAME,
port: parseInt(process.env.REDIS_PORT),
password: process.env.REDIS_PASSWORD
});
redisClient.on('error', function(err) {
console.log('*Redis Client Error: ' + err.message);
});
redisClient.on('connect', function(){
console.log('Connected to redis instance');
});
(async () => {
await redisClient.auth(process.env.REDIS_PASSWORD)
.catch(err => {console.log('Redis auth error: ' + err.message)});
await redisClient.connect()
.catch(err => {console.log('Redis connect error: ' + err.message)});
})();
module.exports = redisClient;
app.js
const session = require("express-session");
const redisStore = require('connect-redis')(session);
const redisClient = require('./session-store/redisClient');
...
app.use(cookieParser());
app.use(session({
store: new redisStore({client: redisClient, ttl: 3600 * 24 * 30}),
saveUninitialized: false,
secret: process.env.SESSION_SECRET,
resave: false
}));
问题是:启动服务器后,我在控制台中收到错误消息,如下所示:
Redis auth error: The client is closed
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
...
我用这个 guide 来设置 redis 云并分配 dotenv 变量(主机、端口和密码)。我已经调试并且 dotenv 工作正常并且我的主机、端口和密码变量正确。
但问题依旧。我仍然收到 The client is closed and connect ECONNREFUSED 127.0.0.1:6379 错误,如上面的控制台日志所示。我该如何解决这个问题?
选项 1:将调用顺序切换为 auth
和 connect
来自Node Redis client documentation:
When connecting to a Redis server that requires authentication, the AUTH command must be sent as the first command after connecting.
因此,您应该将调用顺序切换为 redisClient.auth
和 redisClient.connect
。
选项 2:删除对 auth
的调用
然而,documentation for the password
property of createClient
options 指出:
If set, client will run Redis auth command on connect.
当您向 createClient
提供 password
时,您也可以删除对 auth
.
的显式调用
您必须在访问客户端之前执行 await redisClient.connect()
。尝试在创建后立即移动 redisClient.connect()
。
被困在同一个问题上并找到了一些运气。使用了 'ioredis' 模块而不是无缝工作的 redis。
const redis = require('ioredis');
const redisClient = redis.createClient({host:'your host address',port:your port,username:'',password:''});
redisClient.on('connect',() => {
console.log('connected to redis successfully!');
})
redisClient.on('error',(error) => {
console.log('Redis connection error :', error);
})
module.exports = redisClient;
try this -->
var options = {
client: redis.createClient({
url : process.env.REDIS_URL,
legacyMode: true,
})};
你可以让你的 url 成为 'redis://host:port'
当您使用redis.createClient
创建客户端时,您需要使用url
而不是host
、port
.
它显示 url
格式
redis[s]://[[username][:password]@][host][:port][/db-number]
你的情况可能是这样的
var url = `redis://<YourUsername>:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOSTNAME}:${parseInt(process.env.REDIS_PORT)}`
redis.createClient({
url: url
});
使用host
,port
选项必须是旧版本
我目前使用Express搭建网站,想使用redis云数据库在session中保存userID。 redisClient 在 redisClient.js 中创建,之后我将它传递给 app.js 会话中的 redisStore。这是代码:
redisCLient.js
const redis = require("redis");
let redisClient = redis.createClient({
host: process.env.REDIS_HOSTNAME,
port: parseInt(process.env.REDIS_PORT),
password: process.env.REDIS_PASSWORD
});
redisClient.on('error', function(err) {
console.log('*Redis Client Error: ' + err.message);
});
redisClient.on('connect', function(){
console.log('Connected to redis instance');
});
(async () => {
await redisClient.auth(process.env.REDIS_PASSWORD)
.catch(err => {console.log('Redis auth error: ' + err.message)});
await redisClient.connect()
.catch(err => {console.log('Redis connect error: ' + err.message)});
})();
module.exports = redisClient;
app.js
const session = require("express-session");
const redisStore = require('connect-redis')(session);
const redisClient = require('./session-store/redisClient');
...
app.use(cookieParser());
app.use(session({
store: new redisStore({client: redisClient, ttl: 3600 * 24 * 30}),
saveUninitialized: false,
secret: process.env.SESSION_SECRET,
resave: false
}));
问题是:启动服务器后,我在控制台中收到错误消息,如下所示:
Redis auth error: The client is closed
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
...
我用这个 guide 来设置 redis 云并分配 dotenv 变量(主机、端口和密码)。我已经调试并且 dotenv 工作正常并且我的主机、端口和密码变量正确。
但问题依旧。我仍然收到 The client is closed and connect ECONNREFUSED 127.0.0.1:6379 错误,如上面的控制台日志所示。我该如何解决这个问题?
选项 1:将调用顺序切换为 auth
和 connect
来自Node Redis client documentation:
When connecting to a Redis server that requires authentication, the AUTH command must be sent as the first command after connecting.
因此,您应该将调用顺序切换为 redisClient.auth
和 redisClient.connect
。
选项 2:删除对 auth
然而,documentation for the password
property of createClient
options 指出:
If set, client will run Redis auth command on connect.
当您向 createClient
提供 password
时,您也可以删除对 auth
.
您必须在访问客户端之前执行 await redisClient.connect()
。尝试在创建后立即移动 redisClient.connect()
。
被困在同一个问题上并找到了一些运气。使用了 'ioredis' 模块而不是无缝工作的 redis。
const redis = require('ioredis');
const redisClient = redis.createClient({host:'your host address',port:your port,username:'',password:''});
redisClient.on('connect',() => {
console.log('connected to redis successfully!');
})
redisClient.on('error',(error) => {
console.log('Redis connection error :', error);
})
module.exports = redisClient;
try this -->
var options = {
client: redis.createClient({
url : process.env.REDIS_URL,
legacyMode: true,
})};
你可以让你的 url 成为 'redis://host:port'
当您使用redis.createClient
创建客户端时,您需要使用url
而不是host
、port
.
它显示 url
格式
redis[s]://[[username][:password]@][host][:port][/db-number]
你的情况可能是这样的
var url = `redis://<YourUsername>:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOSTNAME}:${parseInt(process.env.REDIS_PORT)}`
redis.createClient({
url: url
});
使用host
,port
选项必须是旧版本