如何从node.js中的post方法中获取套接字对象?

时间:2017-09-16 15:51:40

标签: node.js sockets express socket.io

在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');
    });
});

如果有客户端,谁首先连接到服务器,创建套接字,然后为POST执行/request,如何从后处理函数中获取该客户端的套接字对象?

由于

3 个答案:

答案 0 :(得分:1)

当您从客户端连接套接字时,您必须将用户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,并在登录事件中写入“连接”代码。

答案 1 :(得分:0)

需要使用TCP消息识别客户端。

为了进行测试,可以使用文件描述:req.socket.fd === socket.fd

请记住,这仅适用于一个服务器,因为http请求可能会打开另一个套接字。

答案 2 :(得分: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);
             }
      }
}

附注:没有必要在原始帖子中保留connectedUsers变量,因为它们位于io.clients()中。已连接

我的代码工作得很好,但它是用Typescript编写的,所以可能会有一些错误,因为我手动翻译了这个答案。