Sails.JS 的发布方法在控制器中不起作用,但在控制台中起作用
Sails.JS's publish method doesn't work in a controller, but works in the console
目前,我正在探索 Web 开发以了解所有炒作的内容。除了在JavaScript接受过小的'create your first CRUD app in Node.JS'和一些正规的培训外,我没有任何经验。
我是 JavaScript、NodeJS、Sails.JS 和 WebSockets 的新手。
我目前的问题是:
我正在尝试开发的应用程序收到 POST 个带有 JSON 对象的调用。这是应用程序的输入部分。这些 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" });
有人有什么想法吗?
sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
, ServiceHeartBeatSession._room(session.id), () => {
ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });
});
文档说它有一个回调。错过了,呵呵。
目前,我正在探索 Web 开发以了解所有炒作的内容。除了在JavaScript接受过小的'create your first CRUD app in Node.JS'和一些正规的培训外,我没有任何经验。
我是 JavaScript、NodeJS、Sails.JS 和 WebSockets 的新手。
我目前的问题是:
我正在尝试开发的应用程序收到 POST 个带有 JSON 对象的调用。这是应用程序的输入部分。这些 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" });
有人有什么想法吗?
sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
, ServiceHeartBeatSession._room(session.id), () => {
ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });
});
文档说它有一个回调。错过了,呵呵。