Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Sails.JS';s的发布方法没有';在控制器中不工作,但在控制台中工作_Javascript_Node.js_Websocket_Sails.js_Sails.io.js - Fatal编程技术网

Javascript Sails.JS';s的发布方法没有';在控制器中不工作,但在控制台中工作

Javascript Sails.JS';s的发布方法没有';在控制器中不工作,但在控制台中工作,javascript,node.js,websocket,sails.js,sails.io.js,Javascript,Node.js,Websocket,Sails.js,Sails.io.js,目前,我正在探索web开发,以了解所有宣传的内容。除了遵循“在Node.JS中创建您的第一个CRUD应用程序”和一些正式的JavaScript培训之外,我没有任何经验 我不熟悉JavaScript、NodeJS、Sails.JS和WebSocket ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" }); 我目前的问题是: 我尝试开发的应用程序接收带有JSON对象的POST调用。这是应用程序的输入部分。这些P

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

我不熟悉JavaScript、NodeJS、Sails.JS和WebSocket

ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });
我目前的问题是:

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

输出是一个网页,通过监听一个名为Sails.io.JS的由Sails.JS驱动的WebSocket系统来更新自己

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

因为我没有构建正式的RESTAPI,所以我必须自己在Sails.JS中定义一些部分。我确实启用了蓝图

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

sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
 , ServiceHeartBeatSession._room(session.id) );
sails.sockets.broadcast([ ServiceHeartBeatSession._room(session.id) ], "serviceheartbeatsession", 'hi!');
然后,执行invoke方法将此事件发送到所有侦听WebSocket

ServiceHeartBeatSession.publish([ session.id ], { "verb": "created" });
但是,.publish方法不会导致现有WebSocket发生事件。除非我自己在控制台中执行它。WebSocket的注册方式如下:

io.socket.on('serviceheartbeatsession', function(resData) {
    alert('Something changed!!!!');
  });
我对源代码做了一些深入的研究,并尝试亲自调试。以下是我到目前为止的发现:

  • 在控制台中运行.publish调用会产生所需的结果
  • 似乎.addRoomMembersToRooms是.publish在控制台中工作的必要条件。所以我假设。addRoomMembersToRooms按预期工作
  • 我尝试了下面的替代方案,但在控制器中不起作用。但是,它确实在节点控制台中工作

    sails.sockets.addRoomMembersToRooms(ServiceHeartBeatSession._classRoom()
     , ServiceHeartBeatSession._room(session.id) );
    
    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" });
});

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

如果有人知道如何摆脱“运行代码片段”按钮,我会洗耳恭听。如果你不让代码运行,那么你想要的格式是将空格键猛击4次,然后插入你的代码示例。另外,检查这个问题可能会有所帮助。我尝试对两个命令都使用wait,没有骰子。谢谢。你的尝试给了我一个主意。我遵守了等待新承诺(完成=>setTimeout(完成,2));在addRoomMembersToRooms和publish方法之间,它就可以工作了。我应该提交一个bug吗?