2017-09-16 10 views
0

は、私はソケットを作り、最初のサーバーに接続するクライアントがある場合、このnode.jsのpostメソッド内からソケットオブジェクトを取得する方法は? Node.jsので

app.post('/request', function(req, res) { 
    // TODO get socket, then do socket.emit('message', {}); 
    res.end(); 
}); 

とソケット

var io = socket.listen(server); 
io.on('connection', function(socket){ 
    console.log('Detected Request'); 
    socket.on('disconnect', function() { 
     console.log('Request Finished'); 
    }); 
}); 

ように設定(表現)サーバーを持っています、 /requestPOSTを実行すると、ポストハンドラ関数内からそのクライアントのソケットオブジェクトを取得する方法はありますか?

ありがとう

答えて

0

TCPメッセージを使用してクライアントを識別する必要があります。

テストの場合、ファイルの説明はreq.socket.fd === socket.fdです。

http要求によって別のソケットが開かれる可能性があるので、これは1つのサーバーにのみ適用できます。

+0

「HTTPリクエストが別のソケットを開く可能性があるので、これは1つのサーバにのみ適用されます。 '? – omega

1

ソケットをクライアントから接続するときには、ユーザーIDとソケットを渡す必要があります。そのIDをキャッチしてそのユーザーのソケットを識別する必要があります。ここ

const socket = io(); 
io('/', { query: "id=user id here" }); 

サーバー側のコード:

var connectedUsers = {}; 
var io = socket.listen(server); 
io.on('connection', function(socket){ 
    var userId = socket.handshake.query['id']; 
    var connectedUser = {id:userId, socket:socket} 
    // every socket connection will have unique socket.id which we use to store in socket and identify if disconnected. 
    connectedUsers[socket.id] = connectedUse 
    socket.on('disconnect', function() { 
     for(var i in connectedUsers) 
     if(connectedUsers[i].socket.id === socket.id){ 
      delete connectedUsers[i]; 
     } 
    }); 
}); 

今すぐあなたのポストの要求に使用すると、同じIDでユーザーを識別し、ユーザーのために、それぞれのソケットを取得する必要があります。

app.post('/request', function(req, res) { 
    var userId = 'write your code to get user id'; 
    if(connectedUsers[userId]) 
    connectedUsers[userId].socket.emit('message', {}); 
    else 
    console.log('User not online'); 
    res.end(); 
}); 

注:これは、ユーザーIDの取得を正しく処理するまでは機能しません。

ログイン後のみユーザーを識別できる場合は、ユーザーログイン用のソケットイベントを作成し、クライアントからサーバーにユーザーIDを送信し、ログインイベント内に「接続」コードを書き込む必要があります。

0

socket.ioの文書にはsending mesagges from the outside worldが埋め込まれており、提案方法はsocket.io-emitterです。私はそれを動作させることができませんでした、そして、私はそれが特定のクライアントではなく、放送だけのためだと思います。代わりに、socket.jsのioオブジェクトに関数を送信しました。

ファイルapp.js:

app.post('/request', function(req, res) { 
    var clientid = //you need to capture the socket id you want at **** 
       //and pass it in the post body or cookie 
    SOCKET.sendX(clientid, "my message"); 
    res.end(); 
}); 

var server = app.listen(8088); 
var SOCKET = require("./socket")(server); 

ファイルsocket.js:

module.exports = function(server) { 

    var io = socket.listen(server); 
    io.on('connection', function(socket){ 
     //**** 
     //here you have to save socket.id for use in your post method 

     //the usual stuff 
     socket.on('xxx', function() { 
     } 

     return { 
     sendX: function send(socket, msg) { 
       io.clients().connected[socket].emit("sendX", msg); 
      } 
     } 
} 

サイドノート:彼らはIOであるとして、あなたのオリジナルのポストにそのconnectedUsers変数を維持する必要はありません。クライアント()。接続

私のコードはかなりうまくいっていますが、Typescriptで書かれているので、この回答を手作業で翻訳したのでエラーがあるかもしれません。

関連する問題