我正在使用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中间件中的一堆上下文传递给羽毛,而我希望不要这样做。
有人知道这样做的方法吗?
答案 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();
});