NodeJS EventEmitter

Я использую модульную настройку, в которой Socket.IO не является частью моего приложения или маршрутов, а находится во внешнем модуле.

У меня есть PHP-скрипт, который получает данные, а затем обновляет базу данных. Я настроил его для отправки запроса cURL в приложение узла, и я хотел бы, чтобы маршрут вызывал событие, которое прослушивает мой модуль сокета, чтобы перейти и выдать событие socket.io, а также обновить то, что клиент видит в в режиме реального времени.

Событие передается всему приложению, или я ошибся в своем подходе?

Спасибо.

Экспресс 3 Маршрут

var events              = require('events');
var event_emitter       = new events.EventEmitter();

router.post('/php-script-calls-this', function(req, res, next) {
    event_emitter.emit('do-socket-event');
    res.sendStatus(200);
});

Файл сокета (подмодуль, вызываемый в моем модуле io.js)

module.exports = function(io, socket) {

    var events              = require('events');
    var event_emitter       = new events.EventEmitter();

    event_emitter.on("do-socket-event", function() {
      socket.emit("update-client-data");
    });

person ash    schedule 29.03.2015    source источник
comment
Вы создаете новый экземпляр события Emitter, который не является ответом singleTon @Josh, который будет работать для вас.   -  person Aman Virk    schedule 29.03.2015


Ответы (1)


Я думаю, проблема в том, что у вас есть 2 отдельных источника событий. В обоих модулях вы создаете экземпляр EventEmitter. Есть ли какая-то конкретная причина, по которой вы не можете просто использовать сокет из маршрута «/php-script-calls-this» и испускать прямо оттуда?

var events              = require('events');
var event_emitter       = new events.EventEmitter();

router.post('/php-script-calls-this', function(req, res, next) {
    socket.emit('update-client-date');
    res.sendStatus(200);
});

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

мое-общее-событие-emitter.js

var events = require('events');
module.exports = new events.EventEmitter();

Затем в вашем файле маршрута:

var events              = require('events');
var event_emitter       = require('my-shared-event-emitter');

router.post('/php-script-calls-this', function(req, res, next) {
    event_emitter.emit('do-socket-event');
    res.sendStatus(200);
});

И, наконец, файл сокета:

module.exports = function(io, socket) {

    var events              = require('events');
    var event_emitter       = require('my-shared-event-emitter');

    event_emitter.on("do-socket-event", function() {
      socket.emit("update-client-data");
    });
}
person Josh    schedule 29.03.2015
comment
Ах, это имеет смысл, спасибо, Джош. Я попробую это сейчас. Я использую экспресс 3 для своего приложения и настраиваю свой socket.io в bin/www, который вызывает io.js (для работы с on.connection и т. д. Я не нашел способ включить все это вместе пока - вот почему я подумал, что попробую события. Еще раз спасибо, Джош, - сообщу, как все пройдет. - person ash; 29.03.2015