Hello StackOverflow朋友们, 我从位于express.js控制器函数内的套接字发出,因为我需要在他的个人资料完成后通知用户。
我需要向调用API端点的特定客户端发出并触发控制器功能。
关于如何最好地做到这一点的任何想法?
我在考虑将socket_id从客户端发送到API调用中的服务器?
谢谢!
修改 我意识到问题在于express.js和socket.io不共享会话数据,它们没有连接到中间件。这篇文章设计了一个解决方案。 socket.io and express 4 sessions
答案 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