我正在使用带角度的socket.io。它运行正常,但我的问题是它会发送到Chrome中打开的所有标签。当前的工作流程是应用程序将在多个选项卡中打开以运行不同的模拟。当我按下按钮(动作)时,它会更新所有打开的标签。但是,我想发射到特定选项卡。我该如何设计呢?我查看了stackoverflow和github,但无法使socket.id工作。
服务器代码
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未定义。我只需找出一种方法来隔离连接到浏览器选项卡。
答案 0 :(得分: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();
}
客户代码
在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)
}
我的下一步是将其与用户授权集成。