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

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

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

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

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

  • PhantomJS создает страницу из строки
  • Где хранятся вары в Nodejs?
  • Nodejs: Ошибка: EADDRNOTAVAIL, Невозможно назначить запрошенный адрес
  • Node.js на многоядерных машинах
  • Аргументы функции серии async node.js
  • Выполнение асинхронных вызовов синхронно
  • Разница между «process.stdout.write» и «console.log» в node.js?
  • Файл IO внутри CasperJS
  • 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) } } 
    Interesting Posts

    Удаляет ли Javascript обработчики событий из удаленных элементов DOM?

    Есть ли полипол для текущего модуля Flex Flex Box Layout в соответствии с W3C CR (отображение: flex и т. Д.)?

    Org.openqa.selenium.UnhandledAlertException: неожиданное предупреждение открыто

    Использование зарезервированных слов в качестве имен свойств, пересмотренных

    Javascript Arrays – проверка двух массивов объектов для одного и того же содержимого, игнорирование порядка

    Toggle показать / скрыть div с кнопкой?

    Очистить форму после отправки с помощью jQuery

    Как я могу выполнить интерполяцию строк в JavaScript?

    Google Map KML-слойная метка click event return ZERO_RESULTS

    Получать mousemove события из iframe, тоже

    Построение регулярного выражения из переменных JS не работает

    В чем разница между (NaN! = NaN) и (NaN! = NaN)?

    Как получить доступ к текстовому содержимому, полученному через <script type = "text / plain" src = …> в JavaScript?

    Могу ли я сделать <кнопку> не отправить форму?

    Как я могу определить поддержку CSS Variable с помощью JavaScript?

    JavaScript делает сайт умным, красочным и простым использованием.