【问题标题】:Sails.JS's publish method doesn't work in a controller, but works in the consoleSails.JS 的发布方法在控制器中不起作用,但在控制台中起作用
【发布时间】:2019-01-16 01:26:04
【问题描述】:

目前,我正在探索 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方法将这个事件发送给所有正在监听的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" });
    

有人有什么想法吗?

【问题讨论】:

  • 如果有人知道如何摆脱“运行代码 sn-p”按钮,那么我会全力以赴。
  • 如果您没有将代码运行,那么您寻找的格式是按空格键 4 次然后插入您的代码示例。
  • 同时查看this 问题可能会有所帮助。
  • 我尝试对两个命令都使用 await,没有骰子。谢谢。
  • 你的尝试给了我一个想法。我坚持了一个 await new Promise(done => setTimeout(done, 2));在 addRoomMembersToRooms 和 publish 方法之间,它可以工作。我应该提交错误吗?

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


【解决方案1】:
sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
           , ServiceHeartBeatSession._room(session.id), () => {
    ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });
});

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

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多