我系统的用户将访问一个页面,从服务器Foo
中提取大量数据,至少500条记录。一旦收集了50条记录,Express将开始呈现页面以向用户显示前50条记录(最初只需要显示前50条记录)。一旦系统从Foo
中提取了所有500条记录,我想向用户发送一条消息,让他们知道操作已完成。
我的想法是在处理完成后调用套接字emit函数,但是我不确定如何从用户获取页面时提供的请求对象中检索套接字ID。是否可以或者我是否需要创建请求ID到套接字ID的映射?
答案 0 :(得分:0)
似乎有很多可行的方法。这是一个简单的:
为每个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-session
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];
您可以使用默认的连接事件,而不是创建自定义事件( request_data ),使其更短。完成后自动断开连接也是可选的。
如果要在Web套接字中更新会话,可以执行以下操作:
socket.handshake.session.username = 'dave';
socket.handshake.session.save();
或者只是将express-socket.io-session
初始化为
sharedsession(session, {
autoSave:true
});