2011-08-11 14 views
0

Node.jsサーバーによって起動された 'upgrade'イベントから、Express.jsフレームワークを使用してセッションオブジェクトにアクセスしようとしています。セッションのサポートを正しく設定してあり、標準の.get .post .putおよび.deleteメソッドからアクセスできます。Node.js + Express.js(Connect) - 'upgrade'イベントからのセッションへのアクセス

app.get('/', function(req, res) { 
    req.session.test = 'Hello world'; // Works fine 
    res.render('index'); 
}); 

しかし、私はそうのように、サーバー上で「アップグレード」イベントをフックアップした場合:

app.on('upgrade', function(req, socket) { 
    var message = req.session.test; // Doesn't work 
}); 

私は、セッションオブジェクトにアクセスすることはできません。私が知っている限り、Connect Sessionミドルウェアはget/post/put/deleteメソッドのセッションを接続しますが、 'upgrade'などのカスタムイベントはセッションを連結しません。

FYI、WebSocketハンドシェイク中にクライアントから 'upgrade'イベントが発行されましたが、最初のWebSocketハンドシェイクからセッションにアクセスしようとしています。セッションクッキーは間違いなく、ハンドシェイク中のHTTPヘッダーにあります。例:

app.on('upgrade', function(req, socket) { 
    var cookieHeader = req.headers['cookie']; 
    console.log(cookieHeader); 
}); 

... Connectセッションクッキーを出力します。おそらく生のセッションクッキートークンを使ってセッションオブジェクトを手動で構築する方法はありますか?


更新:はNode.jsのIRCチャットルームの一部の人に話すにされて、どうやらこれは非常にdifficaltまたは不可能のいずれかです。 Connectミドルウェアは、「アップグレード」などのカスタム/珍しいイベントにはさらされません。

https://github.com/senchalabs/connect/issues/342

答えて

1

あなたはレスポンスオブジェクトへのアクセスを持っていないので、あなたはセッションストアを取得することにより、セッションオブジェクトを検索することができるはずです:彼らはそうここにある、GitHubの中で問題を提起すると述べましたCookieから取得したsession_idでget(session_id, callback)を呼び出してください。また、あなたが持っているreqオブジェクトがreq.res経由で応答にリンクされていれば、実際には通常のセッションミドルウェア機能を呼び出すことができるかもしれませんがexpress.jsがこれを行いますが、これが未処理のnode.jsイベントの場合はその接続この時点では作成されていない可能性があります。ミドルウェアを作成するときは、セッションストアインスタンスを手動で作成し、そのセッションへの参照を保持してから、optionsオブジェクトのセッションミドルウェアファクトリ関数に渡す必要があります。

+0

セッションストアを使用してセッションを作成することをお勧めします。しかし、このイベントはnode.jsレベルで結ばれています。 –

関連する問題