0

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

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

我目前的问题是这样的:

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

输出是一个网页,它通过监听 Sails.JS 驱动的 WebSocket 系统(称为sails.io.js)进行自我更新。

基本上,来自任何主机的每个 POST 都应该在 WebSocket 上产生一个事件。

由于我没有构建正式的 REST API,因此我必须自己在 Sails.JS 中定义一些部分。我确实启用了蓝图。

首先,在处理 POST 调用的控制器中,我可以调用下面的代码,以便现有的 WebSockets 可以接收正在创建的新 ServiceHeartBeatSession 的事件。这里提到的所有服务器端代码都位于控制器中或在控制台中执行。

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

然后,执行invoke 方法将这个事件发送给所有正在监听的WebSocket。

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" });
    

有人有想法么?

4

1 回答 1

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

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

于 2018-08-08T19:17:33.150 回答