Node.js 从Express请求获取SocketIO ID

Node.js 从Express请求获取SocketIO ID,node.js,sockets,socket.io,Node.js,Sockets,Socket.io,我的系统的用户将访问一个页面,从服务器Foo提取大量数据,至少500条记录。收集了50条记录后,Express将开始呈现页面,以便向用户显示前50条记录(最初只需显示前50条记录)。一旦系统从Foo中提取了所有500条记录,我想向用户发送一条消息,让他们知道操作已完成 我的想法是在处理完成后调用socket emit函数,但是我不确定当用户获得页面时如何从提供的请求对象检索socket ID。有没有可能或者我是否需要创建请求ID到套接字ID的映射?似乎有很多可行的方法。这里有一个简单的例子: 为

我的系统的用户将访问一个页面,从服务器
Foo
提取大量数据,至少500条记录。收集了50条记录后,Express将开始呈现页面,以便向用户显示前50条记录(最初只需显示前50条记录)。一旦系统从
Foo
中提取了所有500条记录,我想向用户发送一条消息,让他们知道操作已完成


我的想法是在处理完成后调用socket emit函数,但是我不确定当用户获得页面时如何从提供的请求对象检索socket ID。有没有可能或者我是否需要创建请求ID到套接字ID的映射?

似乎有很多可行的方法。这里有一个简单的例子:

为每个GET请求创建一个唯一的索引,将其存储在服务器中,并将其呈现到客户端页面/代码中

在客户端,将其称为:

socket.on('data_fetched', () => alert('data fully fetched'));
socket.emit('request_data', UNIQUE_INDEX);
在服务器端,有如下内容:

const sockets = {};
...
socket.on('request_data', uniq_idx => {
  sockets[uniq_idx] = socket;
});
然后,在完全获取数据后,您可以调用:

sockets[uniq_idx].emit('data_fetched');
sockets[uniq_idx].disconnect(true);
delete sockets[uniq_idx];
使用express socket.io会话

const sharedsession = require('express-socket.io-session');
const io = require('socket.io').listen(server);
io.use(sharedsession(session));
这样,您就可以通过socket.handshake.session.id访问会话id,因此代码变成:

// Client socket
socket.on('data_fetched', () => alert('data fully fetched'));
socket.emit('request_data');

// Server socket
const sockets = {};
...
socket.on('request_data', () => {
  sockets[socket.handshake.session.id] = socket;
});

// Call once finished fetching data
sockets[req.session.id].emit('data_fetched');
sockets[req.session.id].disconnect(true);
delete sockets[req.session.id];
通过使用默认连接事件而不是创建自定义连接事件(请求\数据),您可以使其更短。完成后自动断开连接也是可选的

如果要在web套接字中更新会话,可以执行以下操作:

socket.handshake.session.username = 'dave';
socket.handshake.session.save();
或者只需将express socket.io会话初始化为

sharedsession(session, {
  autoSave:true
});

如果您使用会话,会更容易/更快,因为您可以有效地将会话id用作上面提到的唯一密钥。我尝试使用“express socket.io session”,但对套接字上会话数据的更改不会反映在express代码中,这没有任何意义。我已经更新了答案以涵盖express-socket.io-session,它现在可以工作了吗?