Я пытаюсь подключиться к онлайн-серверу redis от heroku, но мое соединение получает отказ - PullRequest
0 голосов
/ 29 сентября 2019

Я использую пакет Redis для Node.js (ioredis), у меня есть кластер redis, размещенный на ScaleGrid, к которому я пытаюсь подключиться из heroku, но я получаю сообщение об ошибке [ioredis] Unhandled error event: Error: connect ECONNREFUSED 127.0.0.1:6379 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14) Redis Error: { ReplyError: NOAUTH Authentication required.. Это мой код

//This is what my redis uri provided by ScaleGrid uri looks like, this is not exact string though
REDIS_URI=SG-Stack-12345.servers.mongodirector.com:6379

import session from 'express-session';
import Redis from 'ioredis';
import connectRedis from 'connect-redis';

const redisClient = process.env.REDIS_URI;

const redis = new Redis(redisClient);
const redisStore = connectRedis(session);

redis.on('error', (err) => {
  console.log('Redis Error:', err);
});

app.use(session({
  secret: process.env.SESSION_SECRET,
  name: '_redisSession',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false },
  store: new redisStore({ client: redis, ttl: 86400 }),
}));

Пожалуйста, как мне решить эту проблему? а также почему я до сих пор получаю это Error: connect ECONNREFUSED 127.0.0.1:6379

PS Redis отлично работает на моем localhost

1 Ответ

0 голосов
/ 30 сентября 2019

Я понял, что все, что мне нужно, это отправить пароль для аутентификации сразу после подключения клиента redis (client.auth(password). Мне пришлось согласиться на redislabs enterprise для моего редис-хостинга, а также пришлось перейти с ioredis на redis из-за некоторых странных ошибок. Это код ниже

redis.js

import { createClient } from 'redis';

const {
  PASSWORD: password,
  REDIS_HOST: host, // On localhost, set to 'localhost' or '127.0.0.1'
  REDIS_PORT: port, // On localhost,  set to 6379
} = process.env;

// connect to Redis host with port and host set as environment variables
const client = createClient(port, host, { no_ready_check: true });

// If password is in environment variable, send password to the host for authentication
if (password) {
  client.auth(password, (err) => {
    if (err) throw err;
  });
}

client.on('connect', () => console.log('connected to Redis'));

client.on('error', (err) => {
  console.log('Redis Error:', err);
});

export default client;

Это необязательно, оно показывает только то, как подключенный клиент Redis используется в файле индекса.

index.js

import session from 'express-session';
import connectRedis from 'connect-redis';
import client from './redis'

const redisStore = connectRedis(session);

app.use(session({
  secret: 'IwontTell',
  name: '_stackOverflow',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false },
  store: new redisStore({ client, ttl: 86400 }),
}));

Это прекрасно работает как на локальном хосте, так и в Интернете. Надеюсь, это кому-нибудь поможет

...