2016-12-16 4 views
2

socket.ioを使用して、アプリケーションの毎日アクティブなユーザーを追跡したいと考えています。私のソケット接続は次のようになります。ノード/エクスプレスルートとSocket.ioとの間の通信方法

let visitorData = {}; 

io.on('connection', (socket) => { 
    socket.on('user', (data) => { 
     visitorData[socket.id] = data; 
    }) 

    socket.on('disconnect',() => { 
     delete visitorData[socket.id] 
    }) 
}) 

私は、既存のノード/エクスプレスルートを組み込むことができるようにしたいとのデータが接続をソケットするために、受信しました。特に、/loginエンドポイントへのPOSTを処理して、ログインユーザー名をソケットID接続に関連付ける方法はありますか。例えば

app.get('/login', (req, res, next) => { 
    const someSocket = /* socket */ 
    const someSocketId = /* socket id */; 

    visitorData[someSocketId] = req.body.username; 

    someSocket.emit('user', visitorData); 
}) 

Iは、(A)からsocket.idおよび(b)emit情報をユーザに関連付けるためにノード/エクスプレスルートにsocket.ioを組み込むことができる方法はありますリクエスト/レスポンスボディ?

+0

http://stackoverflow.com/questions/22285299/use-session-data-on-webocket-handshakeの複製のように見えます。 –

+0

うん、同様の考えです。しかし、そのポストはPHPとセッションと関係があります...私はNode/Expressを扱っています。私の質問はセッションとは関係ありません。ルートリクエスト/レスポンスボディをソケットに組み込むだけです。 – Himmel

+0

アクティブユーザーをトラッキングしようとしているのですか、現在のアクティブユーザー数をカウントしていますか? これで何をしたいですか?それは部屋の人の量を追跡するチャットのことですか? 各ユーザーを個別に追跡するよりもはるかに簡単です。多くのサーバー(CPUコア)が必要な場合は、さらに多くの人がいれば必要になります。 –

答えて

2

passport socket.ioを使用して、このような設定を行いました。これは、ソケットからユーザーにアクセスするためのミドルウェアを作成します。

app.js

import GameSocket from './lib/game-socket'; 

var app = express(); 

GameSocket(app, 3700); 

lib/game-socket.js

import Server from 'socket.io'; 
import passportSocketIo from 'passport.socketio'; 
import cookieParser from 'cookie-parser'; 

// Configured redisStore for authentication 
import {redisStore} from '../lib/session'; 

// Configured passport strategy for authentication 
import passport from '../lib/passport'; 

export default function GameSocket(app, port) { 
    // Setup socket 
    var server = new Server(); 
    var io = server.listen(app.listen(port)); 

    // Setup authentication 
    io.use(passportSocketIo.authorize({ 
    key: 'connect.sid', 
    secret: 'your_secret', 
    store: redisStore, 
    passport: passport, 
    cookieParser: cookieParser, 
    success: (data, accept) => accept(null, true), 
    failure: (data, message, err, accept) => { 
     console.log(err); 
     if(err) throw new Error(message); 
    } 
    })); 

    // On connection listener 
    io.sockets.on('connection', function (socket) { 

     // This is an example of getting user info from the socket 
     console.log('Success: New connection with: ', socket.request.user.username); 

     // Add your socket events here 
    }); 

    return io; 
} 

セッションストアを使用する必要があり、これを使用するためにはここに私の実装の一部です。私は個人的にredisセッションストアconnect-redisを使用しました。これはlib/session.jsに設定されています。

+0

'connect-redis'を使わない既存のセッション/ノード設定が既にあります。私はJWTを使っています。 – Himmel

+0

申し訳ありませんが、あなたの設定がどれほど柔軟かわかりませんでした。 [this](https://github.com/senchalabs/connect/wiki#session-stores)リストにセッションストアを使用することができますので、特にredisを使う必要はありません。私は恐れている瞬間に別の実装を持っていません。 – morsecodist

+0

クールな心配はありません。 JWTはセッションをまったく使用しません。 – Himmel

関連する問題