从Express Request

时间:2017-05-23 14:40:31

标签: node.js sockets socket.io

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

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

1 个答案:

答案 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
});