是否为socket.io确认/响应发出了事件?

时间:2018-11-29 21:23:26

标签: javascript node.js socket.io feathersjs engine.io

我正在使用socket.io并用feathersjs表示两者。为了收集指标,我试图捕获通过Express以及socket.io发出的请求的往返行程。

使用快速中间件,可以轻松实现快速表达。

我可以通过socket.use来捕获socket.io 入站请求:

const app = express(feathers());
... (set up feathers services etc.)

app.configure(socketio(function(io) {
  io.use(function(socket, next) {
    socket.use((packet, next) => {
      ... (extract the verb and pathing info from the packet)
      next();
    });
    next();
  });
});

但是,在出站/确认端,找不到socket.use的任何等效项。隐藏在engine.io内部的一些事件,但我无法访问它们。

我实际上是在尝试为每个请求/响应找到一组等效的事件(后者与Express中的finish等效)。

我不能在这里使用连接/断开连接事件;我想捕获通过套接字发出的每个请求,以及为它们发送的响应,而不管羽毛服务和模块如何。

Feathers.js挂钩可以用于此目的,但是它需要将socket.io中间件中的一堆上下文传递给羽毛,而我希望不要这样做。

有人知道这样做的方法吗?

1 个答案:

答案 0 :(得分:0)

万一有人来这里寻找解决方法,我不确定为什么我不早想到它。

入站数据包(在socket.use中可用)将包含一个函数,作为其 last 参数,如果应予以确认。

包装最后一个函数以注入自己的逻辑。

伪代码

socket.use((packet, next) => {
  const id = uuidv4();

  console.log(`start of request: ${id}`);

  const cb = packet[packet.length - 1];
  if (typeof cb === 'function') {
    packet[packet.length - 1] = function() {
      const [err, data] = arguments;
      console.log(`end of request: ${id}`);
      if (err) {
        console.error(err);
      }
      cb(err, data);
    };
  };
  next();
});