2017-02-08 14 views
0

io.emit()socket.emit()の違いを理解すると、接続されたすべてのクライアントにioが送信されますが、socket.emit()は接続されたクライアントにのみ送信されます。Expressルートで「ソケット」(「io」ではなく)を使用する

私は

const io = require('./socket/index')(server); 

app.use((req, res, next) => { 
    res.io = io; 
    next(); 
}); 

がどのように私は「ソケット」を添付することができます...あなたが応答にioインスタンスをバインドして、あなたのルートハンドラでそれを使用することができ特急のパターンを見てきましたイベントを発生させるためのリクエスト/レスポンスオブジェクトのみ接続されたクライアントへ?

例えば:

app.use((req, res, next) => { 

    io.on('connection', (socket) => { 
     res.socket = socket; 
    }); 

    next(); 
}); 

app.post('/upload', (req, res) => { 
    // emits only to the client in question 
    res.socket.emit('upload started'); 
}) 
+1

ユーザーのソケットと同じユーザーからの要求との間には、関連付けを行う必要があります。通常、これはクッキーまたはセッションオブジェクトで行われ、どのソケットがどのエクスプレスセッションに関連しているかを知ることができます。あなたのためにこれを行ういくつかのパッケージがあります。着信するhttp要求をいくつかのuserIDまたはsessionIDに関連付ける方法が必要です。次に、socket.io接続を接続すると、着信したsocket.ioと同じuserIDまたはsessionIDを使用して接続できます.HTTPリクエストが到着したときに結果として得られるソケットを保存することができます。 – jfriend00

+0

私は明示的なセッションではなく、JWTトークンを使用しています。ソケットIDをサーバレンダリングHTMLにダンプすることはできますか?そうすれば、ソケットIDを使って 'socket.emit()'を実行するにはどうしたらいいですか? – Himmel

+0

socket.io接続が行われたときにJWTトークンが表示されますか?あなたのJWTトークンコードは表示されませんので、実際にどのようにして作業しているかについてはほとんど言えません。 – jfriend00

答えて

0

あなたはsocket.ioにid

const clientId = socket.id 
を含んソケットセッションを、返します

// client 
const socket = io.connect($constants.socketUrl,{   
    reconnection:true 
}); 

ソケットIDを維持する必要があります

あなたはそのIDを保持する必要がありますomewhere(localStorage、cookiesなど)。
あなたのサーバーでは、特定のクライアントにメッセージを送信するために、そのIDを指定する必要があります。
socket.io接続しているクライアントのリストをそのまま使用してください。

//server, maybe you would need to add --> const socketId = "/#" + socketId 
//Here is where you use io you passed previously. 
io.sockets.connected[socketId].send(msg); 
+0

は 'ソケットです。IDはクライアントで利用可能ですか?あなたは 'socket.io'はソケットセッションを"返す "と言って、結果としてどの呼び出しを返しますか? – Himmel

+0

接続を確立すると、 'const socket = io.connect'(この例の最初の部分) – Hosar

関連する問題