目前,我正在探索 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" });
有人有想法么?