2017-06-03 76 views
1

我正在使用带有角度的socket.io。它工作正常,但我的问题是,它发射到Chrome中打开的所有标签。目前的工作流程是应用程序将在多个选项卡中打开以运行不同的模拟。当我按下按钮(动作)时,它会更新所有打开的选项卡。但是,我想发射到特定的选项卡。我如何设计?我看着stackoverflow和github,但无法让socket.id工作。Socket.io发送到特定客户端的标签

服务器代码

app.use(function(req, res, next) { 
    var socketid = '' 
    socketio.sockets.on('connection', function(socket) { 
     socketid = socket.id 

     res.socketid = socketid 
      // 
    }); 
    res.socketio = socketio; 
    next(); 
}); 

    console.log('sockrt ' + res.socketid) 
    res.socketio.emit('pyr', output) //res.socketid is undefined 

更新

app.js

app.use(function(req, res, next) { 
    var socketid = '' 
    socketio.sockets.on('connection', function(socket) { 
     socketid = socket.id 

     res.socketid = socketid 
      // 
    }); 
    res.socketio = socketio; 
    next(); 
}); 

py.controller.js(API端点)

export function index(req, res) { 
     console.log('sockrt ' + res.socketid) 
     res.socketio.emit('pyr', output) 

    }; 

端点正在工作,并且socket.io正在工作,但是socket.id未定义。我只需要找出将连接隔离到浏览器选项卡的方法。

+1

你在哪里测试你的res.socketid(即console.log语句位于何处)?有一个很好的机会,你正在访问的外部(在套接字连接事件中)之外访问它,甚至在它被设置之前访问它,因此它的未定义 –

+0

正如大卫所说,因为它的异步,socketid没有被定义,如果它被获取之后执行。 – WilomGfx

+0

@DavidTamrazov更新了解释的代码。 –

回答

0

好的,经过一些试验和错误,我能够解决这个问题。通过SO看,有基于Express和Socket之间共享快速会话的解决方案。虽然它的工作,我无法孤立个别标签。我的使用案例是将其设置为可跨浏览器在多个实例中使用的应用程序(将其视为引用引擎)。下面的解决方案为我工作。

服务器代码

socketio.on('connection', function(socket) { 
    socket.address = `${socket.request.connection.remoteAddress}:${socket.request.connection.remotePort}`; 

    // USED TO SET THE SOCKET ID FOR THE REQUEST 
    socket.emit('initialize', socket.id) 


    socket.connectedAt = new Date(); 
} 

客户端代码
在角,我安装一个初始化事件来存储特定插座的ID为标签

this.socket.on('initialize', socketid => { 
     console.log(socketid) 
     this.socketid = socketid 
    }) 


当该请求是发送表达,我发送作为标题的socketid

return this.$http({ 
    method: 'POST', 
    withCredentials: true, 
    host: '127.0.0.1', 
    data: sim_data, 
    port: 3000, 
    responseType: "arraybuffer", 
    headers: { 
     "X-socketid": this.socketid 
    }, 
    url: '/api/blah' 
}) 

服务器代码
最后,当快递过程中的POST或让我发出的socketid从头

// GET SOCKET ID FROM HEADER 
    var socket_id = req.headers['x-socketid'] 

    if (typeof socket_id !== 'undefined' && socket_id) { 
     var io = req.app.get('io') 
     io.sockets.connected[socket_id].emit('pyr', output) 
    } 

我的下一个步骤是将它与用户授权整合。

相关问题