Golang Revel と Express + Socket.io とのセッション共有 その3 だが、それが正しいかは俺は知らない 編
ラノベ風タイトルで(_ _)です。
だが、結局そういうことなのです。
まず、Revel側のセッション値は、見事に取得できたでございます。
但し、我流も我流でございまして、良い方法があれば、誰かご教授頂きたい限りです。
こういう、パイオニアチックな話題は●uiita当たりのブロガーさんがやってくれそうなもんですが、そもそもRevelとExpressを合わせようとか、変態の極みですね。
さて、まず、Revel側は、
「Go Revel で Redis Sessionの設定」http://d.hatena.ne.jp/factory-g/20150510#1431248569
当たりの設定でRedisでセッション管理と致します。
次に、Express側ですが、Socket.ioでもRedisを使う関係からSession管理もRedisに(私は)しています。
この辺、整理すると、Session管理は、別にRedisにする必要もないかと思いますが、断言できませんので、取り敢えず、この分離に関する議論は、忘れます。
取り敢えず、Express側のRedisセッション管理は以下を参考にコツコツやっておきます。
https://github.com/tj/connect-redis
var express = require('express'); var conf = require('config'); // 定数管理 var session = require('express-session') // セッション管理 var RedisStore = require('connect-redis')(session); // セッションをRdis管理にする var app = express(); var http = require('http').Server(app); var io = require('socket.io')(http); // Express側のセッション設定 app.use(cookieParser()); // cookie用 var sessionStore = new RedisStore({ host: conf.redis.host, port: conf.redis.port } ); app.use( session( { store: sessionStore, secret: conf.cookie.secret, resave: true, saveUninitialized: true, cookie: { httpOnly: false, maxAge: new Date(Date.now() + 60 * 60 * 1000) } } ) );
要らない部分は、省いていますが、かなりの確率で、必要なコードも消しているかもです。
confは、configモジュールで切り出しております。内容は、簡単に想像できるかと思います。
重要なのは、Express専用のセッション管理体系であって、なにかグローバルなルールで縛られている訳ではございません。
はい、当たり前すぎて、自分の無知さが、溢れる文体です_| ̄|○
Socket.ioとExpress側のセッション共有は、以下のHPが親切丁寧です。
「socket.io 1.0 のハンドシェイク(セッション共有)」http://qiita.com/nariyu/items/1c17dd567f866c698481
上記のソースでほぼ大丈夫でした。
var redis = require("redis"), client = redis.createClient(conf.redis.port,conf.redis.host); // (略) io.use(function(socket, next){ console.log("socket.io側のセッションチェック"); // クッキーからセッション ID を取得する var cookie = require('cookie').parse(socket.request.headers.cookie); console.log(cookie); var revel = cookie["REVEL_SESSION"]; var sessionID = revel.split("-")[1]; sessionID = "session:" + sessionID; // 文字列を取得する client.get(sessionID, function(err, val){ if (err) return console.log(err); // エラーが無ければデータを取得できたということ console.log(val); console.log("=====!!!!!!====="); });
ソースは、簡略化しています。
まず、Revelでは、セッションキーが、「session:セッションIDムニャムニャ」で入っています。
Express用のセッションでgetをすると、セッションキーや値の取得あたりで、なんやら特別な処理をするらしくて、内容が取得できません。(何やってるんでしょうかね)
ここで、Revelのsessionソースを紐解くと、単純にRedisにget set してるっぽい事に気づきました。
なので、Express側でも、RedisモジュールそのままでGetをすると、見事取得できました。
それが、以下の部分です。
var redis = require("redis"), client = redis.createClient(conf.redis.port,conf.redis.host);
ここまでで、Revel→Express + Socket.io のセッションは、OKです。
逆も、同じ手順でやっちまえば出来ると思うのですが、今の所自分の需要がないので、忘れる事にします(o_ _)o
さて、エレガントでもスマートでも無いこの方法は、どうなんでしょうかね。
取り敢えず、Revelのセッションが読むという目的は達成できたのですが・・・・。
自分は、取り敢えずこれで、ソフトを作ろうかと思っております。