【问题标题】:Does hapi js uses redis to share session?hapi js 是否使用redis 共享会话?
【发布时间】:2015-12-25 02:53:44
【问题描述】:

redis 通常被 expressJS 用于跨多个节点 js 进程共享会话。 hapiJs 是否使用类似的技术?

【问题讨论】:

    标签: redis hapijs


    【解决方案1】:

    在回答你的问题之前,我想先介绍一下背景。是的,您可以使用 Redis 来共享会话,但首先要确保它是您真正想要/需要的。在会话方面,hapi 和 Express 有点不同。

    如果您已经确定这是您想要的设置,请跳至第 2 部分。

    1。背景

    在 Express 中,唯一存储在 cookie 中的是您的会话 ID。这意味着当您需要扩展到单个服务器之外时,您需要以某种方式查看它们之间的共享会话。 Redis 是一种选择。

    注意会话数据不保存在 cookie 本身中,只是会话 ID。会话数据存储在服务器端。

    https://github.com/expressjs/session#sessionoptions

    hapi Yar 的官方会话插件采用与 Express 略有不同的方法。 只要您尝试在会话中存储的数据低于maxCookieSize,整个会话就会被加密(通过Iron)并存储在cookie 中。这意味着您不需要任何额外的机器服务器端来水平扩展,因为客户端会记住所有内容。

    但是,如果这不符合您的要求或者您只是不喜欢它,您可以通过将 Yar 的 maxCookieSize 设置为 0 来强制服务器端存储。

    maxCookieSize - 使用服务器端存储之前的最大 cookie 大小。默认为 1K。设置为零以始终使用服务器端存储。

    https://github.com/hapijs/yar/blob/master/API.md

    2。将 Redis 与 Yar 和服务器端存储结合使用

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

    【讨论】:

    • 谢谢!这是一个非常明确的答案。我喜欢 hapi js 提供的替代方案。我想我会将会话数据存储在 cookie 中,因为数据非常小。
    • 如果我们想在 cookie 中设置 authtoken,如 req.session.authtoken,我们如何设置 cookie 中的值
    猜你喜欢
    • 2016-12-29
    • 2018-10-21
    • 2016-01-22
    • 2015-03-14
    • 2016-01-12
    • 2015-08-27
    • 1970-01-01
    • 2011-03-03
    • 2015-07-29
    相关资源
    最近更新 更多