【发布时间】:2015-12-25 02:53:44
【问题描述】:
redis 通常被 expressJS 用于跨多个节点 js 进程共享会话。 hapiJs 是否使用类似的技术?
【问题讨论】:
redis 通常被 expressJS 用于跨多个节点 js 进程共享会话。 hapiJs 是否使用类似的技术?
【问题讨论】:
在回答你的问题之前,我想先介绍一下背景。是的,您可以使用 Redis 来共享会话,但首先要确保它是您真正想要/需要的。在会话方面,hapi 和 Express 有点不同。
如果您已经确定这是您想要的设置,请跳至第 2 部分。
在 Express 中,唯一存储在 cookie 中的是您的会话 ID。这意味着当您需要扩展到单个服务器之外时,您需要以某种方式查看它们之间的共享会话。 Redis 是一种选择。
注意会话数据不保存在 cookie 本身中,只是会话 ID。会话数据存储在服务器端。
hapi Yar 的官方会话插件采用与 Express 略有不同的方法。 只要您尝试在会话中存储的数据低于maxCookieSize,整个会话就会被加密(通过Iron)并存储在cookie 中。这意味着您不需要任何额外的机器服务器端来水平扩展,因为客户端会记住所有内容。
但是,如果这不符合您的要求或者您只是不喜欢它,您可以通过将 Yar 的 maxCookieSize 设置为 0 来强制服务器端存储。
maxCookieSize- 使用服务器端存储之前的最大 cookie 大小。默认为 1K。设置为零以始终使用服务器端存储。
将 Yar 与服务器端存储结合使用时,hapi 将使用其cache 功能来存储您的数据。以使用 Redis 为例,只需将 Redis cache 配置传递给 Yar:
const Hapi = require('hapi');
const Hoek = require('hoek');
const server = new Hapi.Server({
cache: {
engine: require('catbox-redis'),
name: 'session', // cache name
host: '127.0.0.1', // redis host
port: 6379, // redis port
database: 'my-db' // redis-db
}
});
server.register({
register: require('yar'),
options: {
maxCookieSize: 0, // force server-side storage
cache: {
cache: 'session'
},
cookieOptions: {
password: 'U32KuiKPnVguRKM', // cookie password
isSecure: false // allow non HTTPS
}
}
}, (err) => {
Hoek.assert(!err, err);
server.start((err) => {
Hoek.assert(!err, err);
console.log('Started server');
});
});
【讨论】: