Метод публикации Sails.JS не работает в контроллере, но работает в консоли

В настоящее время я изучаю веб-разработку, чтобы понять, что же такое шумиха. За исключением небольшого "создания первого приложения CRUD в Node.JS" и некоторого формального обучения JavaScript, у меня нет опыта.

Я новичок в JavaScript, NodeJS, Sails.JS и WebSockets.

Моя текущая проблема заключается в следующем:

Приложение, которое я пытаюсь разработать, получает вызовы POST с объектом JSON. Это входная часть приложения. Эти вызовы POST происходят с любого случайного хоста.

Вывод - это веб-страница, которая обновляется путем прослушивания системы WebSocket с поддержкой Sails.JS под названием sails.io.js.

По сути, каждый POST с любого хоста должен приводить к событию в WebSocket.

Поскольку я не создаю формальный REST API, я должен сам определить некоторые части в Sails.JS. У меня есть чертежи включены.

Во-первых, в контроллере, который обрабатывает вызов POST, я могу вызвать приведенный ниже код, чтобы существующие WebSockets могли получить событие создания новой ServiceHeartBeatSession. Весь упомянутый здесь код серверной стороны находится в контроллере или выполняется в консоли.

sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
 , ServiceHeartBeatSession._room(session.id) );

Затем выполняется метод invoke для отправки этого события всем прослушивающим WebSockets.

ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });

Однако метод.publish не приводит к событию для существующего WebSocket. Если я не выполню это сам в консоли. WebSocket регистрируется так:

io.socket.on('serviceheartbeatsession', function(resData) {
    alert('Something changed!!!!');
  });

Я немного покопался в исходном коде и сам попытался отладить это. Вот что я нашел до сих пор:

  • Выполнение вызова.publish в консоли дает желаемый результат.
  • Похоже, что.addRoomMembersToRooms является требованием для работы.publish в консоли. Поэтому я предполагаю, что.addRoomMembersToRooms работает так, как задумано.
  • Я попробовал альтернативу ниже, но это не работает в контроллере. Тем не менее, он работает в консоли Node.

    sails.sockets.broadcast([ ServiceHeartBeatSession._room(session.id) ], "serviceheartbeatsession", 'hi!');
    
  • Следующее работает как задумано, но я предпочитаю не использовать это.

    sails.io.sockets.emit('serviceheartbeatsession', { verb: 'created' });
    
  • Приведенной выше попытке не хватило выбора комнаты, поэтому я вырыл немного глубже. Вызовы ниже, где результат метода.publish. Однако только после повторения этого в консоли все заработало.

    var emitter = sails.io.sockets;
    emitter.in('sails_model_serviceheartbeatsession_5b6b26748377829d34983d67:serviceheartbeatsession'); // for example
    emitter.emit('serviceheartbeatsession', { verb: "created" });
    

У кого-нибудь есть идеи?

1 ответ

Решение
sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
           , ServiceHeartBeatSession._room(session.id), () => {
    ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });
});

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

Другие вопросы по тегам