質問
Expressフレームワークを使用しています。 socket.ioからセッションデータに到達したいと思います。 client.listener.server.dynamicviewhelpersデータを使用してExpress Dynamichelpersを試してみましたが、セッションデータは取得できません。これを行う簡単な方法はありますか?コードをご覧ください
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
解決
これは、FlashSocket Transportを使用するソケットでは機能しません(必要なCookieをサーバーに送信することはありません)が、他のすべてに確実に機能します。コード内のFlashSocket Transportを無効にするだけです。
Express/Connect側で機能させるために、セッションストアを明示的に定義して、ソケット内で使用できるようにします。
MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
app.use(express.session({ store: session_store }));
});
次に、ソケットコード内に接続フレームワークを含めて、Cookieの解析を使用してCookie.sidを取得できるようにします。次に、Connect.sidを持っているセッションストアでセッションを調べます。
var connect = require('connect');
io.on('connection', function(socket_client) {
var cookie_string = socket_client.request.headers.cookie;
var parsed_cookies = connect.utils.parseCookie(cookie_string);
var connect_sid = parsed_cookies['connect.sid'];
if (connect_sid) {
session_store.get(connect_sid, function (error, session) {
//HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
});
}
});
その後、必要に応じてセッションを使用できます。
他のヒント
ホイールを完全に再発明しないことをお勧めします。必要なツールはすでにNPMパッケージです。これが必要なものだと思います。 session.socket.io私は最近それを使用しています、そしてそれは私が推測する非常に役立つでしょう!! Express-Sessionをsocket.ioレイヤーにリンクするには、非常に多くの利点があります!
編集: うまくいかなかったいくつかのモジュールを試した後、私は実際にこれを行うために自分のライブラリを書きました。恥知らずなプラグ:チェックしてください https://github.com/aviddiviner/socket.io-sessions. 。歴史的な目的のために以下の古い投稿を残します。
私はこの仕事を非常にきれいに手に入れました FlashSocket 通りの輸送 PR0ZAC上記の解決策。また、Socket.ioでExpressを使用しています。これが方法です。
まず、セッションIDをビューに渡します。
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
次に、あなたの見解では、socket.ioクライアント側にリンクします。
<script>
var sid = '<%= connect_sid %>';
var socket = new io.Socket();
socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>
次に、サーバー側のsocket.ioリスナーで、それを拾ってセッションデータを読み取り/書き込みます。
var socket = io.listen(app);
socket.on('connection', function(client){
client.on('message', function(message){
session_store.get(message.sid, function(error, session){
session.pings = session.pings + 1 || 1;
client.send("You have made " + session.pings + " pings.");
session_store.set(message.sid, session); // Save the session
});
});
});
私の場合、私の session_store
Redisは、を使用しています redis-connect
図書館。
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
これがGoogleを検索中にこの投稿を見つけた人を助けることを願っています(私がしたように)
これを参照してください: socket.io認証
私は何もフェッチしないことをお勧めします client.request...
また client.listener...
それはに直接添付されていないため client
オブジェクトし、常にログインしたユーザーを指してください!
チェックアウト socket.io-connect
socket.io-nodeの周りにWebsocket Middlewareラッパーを接続しますhttps://github.com/bnoguchi/socket.io-connect
これにより、socket.ioイベントハンドラーで処理する前に、Socket.ioリクエストをExpress/Connect Middlewareスタックを押し下げることができ、セッション、Cookieなどにアクセスできます。ただし、すべてのsocket.ioのトランスポートで動作するかどうかはわかりません。
あなたはそれを利用することができます Express-socket.io-session .
socket.ioとクッキーベースのエクスプレスセッションミドルウェアを共有します。 Express> 4.0.0およびsocket.io> 1.0.0で動作し、後方互換性がありません。
私のために働いた!
あなたはこれを見ることができます: https://github.com/bmeck/session-web-sockets
または、使用することもできます。
io.on('connection', function(client) {
var session = client.listener.server.viewHelpers;
// use session here
});
お役に立てれば。
私がそれを正しくやっているかどうかはわかりません。https://github.com/learnboost/socket.io/wiki/authorizing
握手データを使用すると、Cookieにアクセスできます。また、Cookieでは、各クライアントのセッションIDであるConnect.SIDをつかむことができます。次に、connect.sidを使用してデータベースからセッションデータを取得します(Redisstoreを使用していると仮定しています)