socket.io 클라이언트가 각 이벤트를 개별적으로 지정하지 않고도 모든 이벤트에 응답하도록 할 수 있습니까?
예를 들어, 다음과 같은 것 (지금 당장은 분명히 작동하지 않음) :
var socket = io.connect("http://myserver");
socket.on("*", function(){
// listen to any and all events that are emitted from the
// socket.io back-end server, and handle them here.
// is this possible? how can i do this?
});
클라이언트 측 socket.io 코드에서 모든 이벤트를 수신 할 때이 콜백 함수가 호출되기를 원합니다.
이것이 가능한가? 어떻게?
답변
socket.io 라이브러리가 사전에 저장하는 것처럼 보입니다. 따라서 소스를 수정하지 않고는 이것이 가능할 것이라고 생각하지 마십시오.
에서 소스 :
EventEmitter.prototype.on = function (name, fn) {
if (!this.$events) {
this.$events = {};
}
if (!this.$events[name]) {
this.$events[name] = fn;
} else if (io.util.isArray(this.$events[name])) {
this.$events[name].push(fn);
} else {
this.$events[name] = [this.$events[name], fn];
}
return this;
};
답변
socket.io-client 1.3.7에 대한 업데이트 된 솔루션
var onevent = socket.onevent;
socket.onevent = function (packet) {
var args = packet.data || [];
onevent.call (this, packet); // original call
packet.data = ["*"].concat(args);
onevent.call(this, packet); // additional call to catch-all
};
다음과 같이 사용하십시오.
socket.on("*",function(event,data) {
console.log(event);
console.log(data);
});
Mathias Hopf와 Maros Pixel 중 하나가 가까워졌지만 이것은 내가 조정 한 버전입니다.
참고 : 이것은 연결 / 연결 해제 등이 아닌 사용자 지정 이벤트 만 포착합니다.
답변
마지막으로 클라이언트와 서버 측에서 와일드 카드 를 사용할 수있는 socket.io-wildcard 라는 모듈 이 있습니다.
var io = require('socket.io')();
var middleware = require('socketio-wildcard')();
io.use(middleware);
io.on('connection', function(socket) {
socket.on('*', function(){ /* … */ });
});
io.listen(8000);
답변
여기 있습니다 …
var socket = io.connect();
var globalEvent = "*";
socket.$emit = function (name) {
if(!this.$events) return false;
for(var i=0;i<2;++i){
if(i==0 && name==globalEvent) continue;
var args = Array.prototype.slice.call(arguments, 1-i);
var handler = this.$events[i==0?name:globalEvent];
if(!handler) handler = [];
if ('function' == typeof handler) handler.apply(this, args);
else if (io.util.isArray(handler)) {
var listeners = handler.slice();
for (var i=0, l=listeners.length; i<l; i++)
listeners[i].apply(this, args);
} else return false;
}
return true;
};
socket.on(globalEvent,function(event){
var args = Array.prototype.slice.call(arguments, 1);
console.log("Global Event = "+event+"; Arguments = "+JSON.stringify(args));
});
이 같은 행사 잡을 것 connecting
, connect
, disconnect
, reconnecting
너무, 너무 돌봐를 수행하십시오.
답변
참고 :이 답변은 socket.io 0.x에만 유효합니다.
socket. $ emit을 재정의 할 수 있습니다 .
다음 코드를 사용하면 두 가지 새로운 기능이 있습니다.
- 모든 이벤트 트랩
- 이전 메서드에 의해 트랩되지 않은 이벤트 만 트랩 (기본 리스너)
var original_$emit = socket.$emit;
socket.$emit = function() {
var args = Array.prototype.slice.call(arguments);
original_$emit.apply(socket, ['*'].concat(args));
if(!original_$emit.apply(socket, arguments)) {
original_$emit.apply(socket, ['default'].concat(args));
}
}
socket.on('default',function(event, data) {
console.log('Event not trapped: ' + event + ' - data:' + JSON.stringify(data));
});
socket.on('*',function(event, data) {
console.log('Event received: ' + event + ' - data:' + JSON.stringify(data));
});
답변
답변
socket.io-client 1.7.3
2017 년 5 월 현재 다른 솔루션이 내가 원하는대로 작동하도록 만들 수 없었습니다. 테스트 목적으로 만 Node.js를 사용하여 인터셉터를 만들었습니다.
var socket1 = require('socket.io-client')(socketUrl)
socket1.on('connect', function () {
console.log('socket1 did connect!')
var oldOnevent = socket1.onevent
socket1.onevent = function (packet) {
if (packet.data) {
console.log('>>>', {name: packet.data[0], payload: packet.data[1]})
}
oldOnevent.apply(socket1, arguments)
}
})
참조 :