socket.io从express.js控制器发送到调用API端点的特定客户端

时间:2016-12-13 23:42:57

标签: node.js express socket.io

Hello StackOverflow朋友们, 我从位于express.js控制器函数内的套接字发出,因为我需要在他的个人资料完成后通知用户。

我需要向调用API端点的特定客户端发出并触发控制器功能。

关于如何最好地做到这一点的任何想法?

我在考虑将socket_id从客户端发送到API调用中的服务器?

谢谢!

修改 我意识到问题在于express.js和socket.io不共享会话数据,它们没有连接到中间件。这篇文章设计了一个解决方案。 socket.io and express 4 sessions

2 个答案:

答案 0 :(得分:1)

下面的实现解决了传递启动API请求的套接字的问题。它遵循通过请求发送socketid的想法。当用户在同一浏览器中打开多个选项卡时,共享会话变量不起作用,因为浏览器会在选项卡上分配相同的Cookie /会话。

服务器代码

  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();
}

客户代码
在Angular中,我设置了一个初始化事件来存储选项卡的特定套接字ID

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


当请求发送到express时,我发送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)
    }

我的下一步是将其与用户授权集成。

答案 1 :(得分:-1)

在套接字处理程序中使用socket.emit,如下所示:

+"max_date": get me max of end_date and the whole row of the row highlighted 
+"Count(comments)": get me all the comments count for this one which is 3