2016-07-02 5 views
0

ルート(エンドポイント)へのリクエストを行わずにログインしたユーザーデータを取得する方法を教えてください。ルートをレンダリングせずにuser_idを取得

//how about I want to get logged in user's id here? 

router.get('/',function(req,res,next){ 
    //usually we get data here 
} 

は、私たちは、ユーザーのオブジェクトは、ユーザーの無数をホストできるreq.user.idを使用したりres.locals.userId = req.user.id

答えて

1

あなたのサーバに保存することができます知っている(それはマルチユーザです)。したがって、特定のユーザーからの特定の要求にない場合、単一の「現在の」ユーザーまたは「ログインした」ユーザーは存在しません。

リクエストを処理するときには、特定のユーザーのために何かをしているだけなので、そのリクエストに関連付けられた特定のユーザーがいます。

ログインの仕方によっては、現在ログインしているすべてのユーザーがいる種類のセッションストアがある場合があります。現在ログインしているユーザーは、通常、要求の中で(その要求のための)セッションCookieを見て、セッションストアからユーザー情報を取得するためにそのセッションCookieをローカルセッションストアで検索することによって、要求内で認識されます。


ユーザー情報を欲しいポイントはsocket.io接続の確立にある場合は、socket.io接続がclient.request.headers.cookieを介して確立された時点でクッキーへのアクセスを得ることができます。クッキーを使用すると、ログインセッションを取得し、必要な他のセッション情報にアクセスできるようになります(通常のhttpリクエストと同じです)。

io.on('connection', function(client) { 
    var cookie = client.request.headers.cookie; 
    // using the cookie, you should then be able to get to your login session 
    // using the session, you should be able to get to any other login data 
}); 

覚えておくべき概念事は(のWebSocketに基づいています)socket.io接続の作成は、常に(当時のWebSocket接続にアップグレードするプロトコルです)通常のHTTPリクエストを開始することです。したがって、その時点ではすべての通常のHTTPのもの(Cookie、ヘッダーなど)が利用可能です。

上記のCookieを設定するユーザー認証をまだ実装していない場合は、socket.io接続を作成する前にユーザーを認証させる必要があります(アクセス時にCookieが存在するため) socket.ioミドルウェア経由でサポートされているsocket.io接続プロセスの一部としてユーザー認証を実装する必要があります。

パスポートからCookieにアクセスできない場合は、How to access Cookie set with Passport.jsをご覧ください。

+0

このモジュールが役に立ちます。 https://github.com/lmaccherone/node-localstorageしかし、リクエストやミドルウェアを使わずにどのユーザーがログインしているかを知るにはどうすればいいですか? –

+0

実際に私はリクエスト/ミドルウェアを呼び出さずにユーザーの日付を必要としています。このようなリクエスト/ミドルウェアの外に私のsocket.ioを入れてください。 –

+0

@AliciaBrandon - 'io.on( '接続 '、...) 'は、ユーザーのリクエスト内にあります(これは、あなたの質問の情報が欲しい場所です)。これはsocket.io接続の開始です。ソケットが 'client.request.headers.cookie'によって接続された時点で、現在の接続のクッキーにアクセスすることができます。クッキーから、セッションストアのログイン情報にアクセスできるはずです。 – jfriend00

0

明示的にmiddlewareを使用し、ルートが処理される前にユーザーのIDを確認し、それに従ってリダイレクトすることができます。

+1

アクティブなリクエストがないときにOPが現在のユーザーについて質問しているようです。ミドルウェアは常に要求の一部であるため、適用されません。 – jfriend00

+0

アクティブなリクエストがない場合、現在のユーザオブジェクトをどのように知ることができますか?ある種の要求がなされなければならない。 – northsideknight

関連する問題