Sails.JS的publish方法在控制器中不起作用,但在控制台中起作用

时间:2018-08-08 17:29:43

标签: javascript node.js websocket sails.js sails.io.js

当前,我正在探索Web开发,以了解所有宣传内容。除了遵循一个小的“在Node.JS中创建您的第一个CRUD应用程序”和一些JavaScript的正规培训之外,我没有任何经验。

我是JavaScript,NodeJS,Sails.JS和WebSockets的新手。

我当前的问题是:

我正在尝试开发的应用程序接收带有JSON对象的POST调用。这是应用程序的输入部分。这些POST调用来自任何随机主机。

输出是一个网页,该网页通过侦听名为Sails.io.js的基于Sails.JS的WebSocket系统进行更新。

基本上,来自任何主机的每个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 个答案:

答案 0 :(得分:0)

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

文档说有一个回调。错过了,呵呵。