0

我正在使用socket.io 并用feathersjs 表达两者。对于指标收集,我试图捕获通过 Express 和 socket.io 发出的请求的往返。

express 方面很容易使用 express 中间件。

我可以通过以下方式捕获 socket.io入站请求socket.use

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 内部有一些事件,但我无法访问它们。

我真的试图找到为每个请求/响应发出的一组等效事件(后者相当于finishin express)。

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

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

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

4

1 回答 1

0

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

入站数据包(在 中可用socket.use)将包含一个函数作为其最后一个参数,如果它应该被确认。

包装最后一个函数来注入我自己的逻辑是有效的。

伪代码

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();
});
于 2018-12-03T21:33:35.073 回答