Метод публикации 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" });
});
Документация говорит, что есть обратный вызов для этого. Пропустил это, хе-хе.