2017-02-01 3 views
1

J'utilise express et connect-redis pour que le serveur utilise Redis pour les sessions.RedisStore ignore les champs d'hôte et de port

import Session from 'express-session'; 
const session = Session({ 
    resave: true, 
    saveUninitialized: true, 
    key: '...', 
    secret: '...', 
    store: initializeRedis(Session); 
}); 

Le initialiseur Redis se présente comme suit:

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

Selon le option parameters précédent, le serveur doit être connecté à redis au lieu de la valeur par défaut 127.0.0.1 via le port 6378 au lieu de la valeur par défaut 6379

Cependant, quelle que soit la valeur de ces valeurs, j'ai toujours la même sortie:

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

Y at-il quelque chose que j'ai raté pendant la configuration?

Répondre

0

TL; DR

Le client Redis manquait les paramètres host et port. Il n'y avait pas de client à l'intérieur du RedisStore.

const redisClient = createRedisClient({ 
    host: 'redis', 
    port: 6379 
}); 

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

code complet de copie paste'able à la fin du poste, dans le cas où il est utile pour quelqu'un d'autre.

Version complète

Il y avait deux manières de résoudre le code ci-dessus.

1. Le const redisClient = createRedisClient() a été assigné nulle part, mais il faisait toujours son travail de connexion. Par conséquent, le serveur s'est bloqué car il ne pouvait pas se connecter, mais ce n'était pas une erreur RedisStore.

Au moment où j'ai posté la question, je n'ai pas remarqué que la ligne était là et je pensais que c'était en panne à cause du magasin. En fait, sans cette ligne, il fonctionne, car le 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. Le client Redis manquait la coutume hôte et des valeurs de port (valeurs par défaut sont '127.0.0.1' et 6379)

import { createClient as createRedisClient } from 'redis'; 
    const redisClient = createRedisClient({ 
    host: 'redis', 
    port: 6379 
    }); 

Si nous utilisons une implémentation spécifique du client, il il est également logique que nous passons dans le RedisStore:

const RedisStore = connectRedis(Session); 
    return new RedisStore({ 
    client: redisClient, 
    }); 

Code à emporter pleine

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