2017-02-01 64 views
1

我使用expressconnect-redis來讓服務器使用Redis進行會話。RedisStore忽略主機和端口字段

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而不是默認連接到redis,而不是默認127.0.0.16379

但是,無論這些值等於多少,我總能得到相同的輸出:

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

在配置過程中是否遺漏了任何東西?

回答

0

TL; DR

Redis的客戶端缺失的hostport參數。 RedisStore內部沒有客戶。在帖子的末尾

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

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

完全複製paste'able碼,如果它是對別人有用。

完整版

有幾種方法可以解決上面的代碼。

1. const redisClient = createRedisClient()被分配到任何地方,但它仍然在做它的連接工作。因此,服務器崩潰是因爲它無法連接,但它不是RedisStore錯誤。

當時我發佈了這個問題,我沒有注意到那條線是在那裏,我認爲它是由於商店崩潰。

事實上,沒有這條線它的工作原理,因爲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 }); 
}