Слушайте все выпущенные события в Node.js

В Node.js есть ли способ прослушать все события, испущенные объектом EventEmitter?

Например, вы можете сделать что-то вроде …

event_emitter.on('',function(event[, arg1][, arg2]...) {} 

Идея заключается в том, что я хочу захватить все события, которые выплевываются на стороне сервера JSON.stringify , JSON.stringify данных событий, отправлять их через соединение с веб-соединениями, реформировать их на стороне клиента в качестве события, а затем действовать на событие На стороне клиента.

  • Может ли узел правильно вернуть значение из вызова функции перед выполнением всех операций внутри самой функции?
  • Передача файлов cookie в HTTP-запросе NodeJs
  • Неверный флажок проверяется флажком на основе условного (если)
  • Redis как база данных
  • Ошибка при обрыве: модуль не регистрировался самостоятельно
  • Настройка отчета о покрытии кода для Karma on TeamCity
  • Петля с национальными обещаниями;
  • Самый быстрый способ скопировать файл в node.js
  • 8 Solutions collect form web for “Слушайте все выпущенные события в Node.js”

    Как уже упоминалось, это поведение не в ядре node.js. Но вы можете использовать eventEmitter2 hij1nx:

    https://github.com/hij1nx/EventEmitter2

    Он не нарушит существующий код с помощью EventEmitter, но добавляет поддержку пространств имен и подстановочных знаков. Например:

     server.on('foo.*', function(value1, value2) { console.log(this.event, value1, value2); }); 

    Я знаю, что это немного устарело, но что, черт возьми, вот еще одно решение, которое вы могли бы предпринять.

    Вы можете легко обезвредить функцию испускания излучателя, который вы хотите поймать на всех событиях:

     function patchEmitter(emitter, websocket) { var oldEmit = emitter.emit; emitter.emit = function() { var emitArgs = arguments; // serialize arguments in some way. ... // send them through the websocket received as a parameter ... oldEmit.apply(emitter, arguments); } } 

    Это довольно простой код и должен работать на любом эмиттере.

    Атрибут _events, по-видимому, зависит от слушателей, которые определены на объекте, поэтому он не выполняет то, что задает вопрос. Другими словами, если определить слушателя e.on («foo», …), то «eoo» появляется в e._events, даже если e никогда не испускает «foo». С другой стороны, e может испускать «бар», который, если его не прослушать, не появится в e._events.

    В частности, для отладки было бы неплохо иметь такую ​​«подстановочную» возможность, слушатель формы e.on («*», …), но эта функция, похоже, не доступна.

    Это основано на ответе Мартина, приведенном выше. Я немного новичок в узле, поэтому мне нужно было разработать свой ответ для себя. Метод в конце, logAllEmitterEvents – важный бит.

     var events = require('events'); var hungryAnimalEventEmitter = new events.EventEmitter(); function emitHungryAnimalEvents() { hungryAnimalEventEmitter.emit("HungryCat"); hungryAnimalEventEmitter.emit("HungryDog"); hungryAnimalEventEmitter.emit("Fed"); } var meow = function meow() { console.log('meow meow meow'); } hungryAnimalEventEmitter.on('HungryCat', meow); logAllEmitterEvents(hungryAnimalEventEmitter); emitHungryAnimalEvents(); function logAllEmitterEvents(eventEmitter) { var emitToLog = eventEmitter.emit; eventEmitter.emit = function () { var event = arguments[0]; console.log("event emitted: " + event); emitToLog.apply(eventEmitter, arguments); } } 

    Возможно, вы захотите изучить модули RPC для node.js. Если я не ошибаюсь, модуль Dnode RPC имеет пример сервера чата / клиента, аналогичный тому, что вы пытаетесь сделать. Таким образом, вы можете использовать свой модуль или скопировать то, что они делают.

    Вкратце, пример показывает сервер, который при подключении создает слушатели для всех событий сервера от подключенного клиента. Он делает это, просто повторяя хранимый список имен событий.

     var evNames = [ 'joined', 'said', 'parted' ]; con.on('ready', function () { evNames.forEach(function (name) { emitter.on(name, client[name]); }); emitter.emit('joined', client.name); }); 

    Этот код является умным, поскольку он автоматически вызывает удаленный вызов процедуры на клиенте, связанный с событием, когда событие выдается.

    Вы также можете использовать другую реализацию эмиттера событий, например https://github.com/ozantunca/DispatcherJS . Реализация будет выглядеть так:

     dispatcher.on('*', function () {}); 

    Диспетчер JS также поддерживает пространства имен и даже зависимости, чтобы определить, какие вызовы будут вызваны первыми.

    Вот инструмент отладки, вдохновленный ответом Мартина ( https://stackoverflow.com/a/18087021/1264797 ). Я просто использовал это, чтобы выяснить, что происходит в наборе потоков, запустив все свои события на консоль. Прекрасно работает. Как показывает Мартин, OP может использовать его, заменив вызов console.log () на отправителя websocket.

     function debug_emitter(emitter, name) { var orig_emit = emitter.emit; emitter.emit = function() { var emitArgs = arguments; console.log("emitter " + name + " " + util.inspect(emitArgs)); orig_emit.apply(emitter, arguments); } } 

    С классами ES6 это очень просто:

     class Emitter extends require('events') { constructor() { super() } emit(e) { console.log(e + " emitted") super.emit(...arguments) } } 
    JavaScript делает сайт умным, красочным и простым использованием.