[解決済み] Socket.IO 1.xとExpress 4.xでセッションを共有するには?
2023-01-17 20:45:53
質問
Socket.io 1.0 と Express 4.x でセッションを共有するにはどうしたらよいですか。Redis Store を使用していますが、問題ないはずです。Cookie を参照し、セッションを取得するためにミドルウェアを使用しなければならないことは分かっていますが、その方法が分かりません。検索してみましたが、動作するものは見つかりませんでした。
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
どのように解決するのですか?
解決方法は驚くほど簡単です。ただ、あまり文書化されていないだけです。このような小さなアダプタを使用することで、express セッション ミドルウェアを Socket.IO ミドルウェアとしても使用することができます。
sio.use(function(socket, next) {
sessionMiddleware(socket.request, socket.request.res, next);
});
express 4.x、Socket.IO 1.x、Redisを使用した完全な例です。
var express = require("express");
var Server = require("http").Server;
var session = require("express-session");
var RedisStore = require("connect-redis")(session);
var app = express();
var server = Server(app);
var sio = require("socket.io")(server);
var sessionMiddleware = session({
store: new RedisStore({}), // XXX redis server config
secret: "keyboard cat",
});
sio.use(function(socket, next) {
sessionMiddleware(socket.request, socket.request.res || {}, next);
});
app.use(sessionMiddleware);
app.get("/", function(req, res){
req.session // Session object in a normal request
});
sio.sockets.on("connection", function(socket) {
socket.request.session // Now it's available from Socket.IO sockets too! Win!
});
server.listen(8080);
関連
-
[解決済み】エラー TRK0005: 位置特定に失敗しました。"CL.exe"
-
[解決済み】ENOENT, そのようなファイルまたはディレクトリがありません。
-
[解決済み】MongoDBでコレクションを日付で並べ替えるには?
-
[解決済み】MongoDBのデータ/DBが見つからない
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] node.jsのセットアップウィザードが途中で終了してしまう
-
[解決済み] ノードマータ予期せぬフィールド
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] socket.ioとwebsocketの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ExpressJSとMeteorJSの比較【終了しました
-
[解決済み】Node.jsのホスト名/IPが証明書のaltnamesと一致しない。
-
[解決済み】nodemon - app crashed - waiting for file changes before start
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] bodyParser は非推奨です express 4
-
[解決済み] npm install エラー - ローカルの発行者証明書を取得できません。
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] MongoNetworkError: 最初の接続でサーバー [localhost:27017] への接続に失敗 [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017] 。