【发布时间】:2018-12-14 13:07:18
【问题描述】:
我使用 memcached 作为 ExpressJS 会话的后备存储 - 通过应用配置设置选择。如果无法联系到 memcached 主机,我想从 memcached 退回到内存。 (这不一定是生产策略,因为 memcached 非常可靠 - 当我忘记在 dev 中启动 Docker 实例时,它更适用,但仍然可能是生产故障安全的。)
我首先认为我可以“app.use”一个新的会话实例,并尝试删除第一个,但我已经读到很难(如果可能的话)“不使用” Express 中间件,即交换中间件在链中就地,或者通常在设置链后对其进行修补。
连接超时后的问题是,应用中间件已经设置好,在会话中间件之后安装了许多进一步的服务。
我的第二个想法是我可以重新配置 Express Session 实例本身并在它创建后更改存储吗?我在the documentation 中看不到任何方法。
我的第三个想法是将 express-session 包装在一个新的“可交换存储”类中,但我对包装整个界面的范围持谨慎态度。
例如在我的应用设置中:
app.use(services.session.middleware());
// then a lot of other middleware...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(rootPath, 'public')));
...etc
在会话服务中,它选择和配置会话实例:
function middleware() {
// default / Memory Store options
const opts = {
resave: false,
saveUninitialized: false,
...etc
}
};
// Install any configured backing store
if(config.session.storage === "memcached"){
const MemcachedStore = require('connect-memcached')(session);
opts.proxy = 'true';
opts.store = new MemcachedStore({
hosts: ...,
secret: ...
});
const errorHandler = (type, details)=> {
/* HERE I WOULD LIKE TO RE-MAKE THE SESSION USING MEMORY
* AND DISCARD THE MEMCACHED ONE
* (THIS HAPPENS AFTER APP BOOT HAS FINISHED)
*/
console.error( String.format("Memcached {3} with host:{0} details:{1}.", details.server, details.messages.join( '' ), type));
}
opts.store.client.on('failure', details => errorHandler('failure', details));
opts.store.client.on('issue', details => errorHandler('issue', details));
}
return session(opts);
}
【问题讨论】:
标签: javascript node.js express express-session