使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]

Posted

技术标签:

【中文标题】使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]【英文标题】:Emit an event with node.js socket client to sails.js (0.11.x) [duplicate] 【发布时间】:2015-08-19 16:17:37 【问题描述】:

服务器:sails.js (0.11.x) 是服务器

客户端:带有sails.io@0.11.5 和socket.io-client@1.3.5 的node.js 脚本

大局:我拥有或将拥有一个连接到sails.js 服务器并执行各种任务的node.js 脚本群。

即时目标:我想在客户端->服务器的套接字连接期间发出一个事件,例如:

socket.emit('got_job', job.id);

为什么?如果可能的话,我可以在一个控制器(或控制器 + 服务)中的服务器端创建各种事件处理程序,并在管理客户端/服务器端点之间的一组有状态事务以支持此脚本场的同时保持我的代码干净。

文档:这就是如何使用 socket.io-client 来处理sails.js,根据sails 文档:https://github.com/balderdashy/sails.io.js?files=1#for-nodejs

除了该链接中的内容外,我没有太多代码可以分享,但我会将其粘贴在这里以防万一:

var socketIOClient = require('socket.io-client');
var sailsIOClient = require('sails.io.js');

// Instantiate the socket client (`io`)
// (for now, you must explicitly pass in the socket.io client when using this library from Node.js)
var io = sailsIOClient(socketIOClient);

// Set some options:
// (you have to specify the host and port of the Sails backend when using this library from Node.js)
io.sails.url = 'http://localhost:1337';
// ...

// Send a GET request to `http://localhost:1337/hello`:
io.socket.get('/hello', function serverResponded (body, JWR) 
  // body === JWR.body
  console.log('Sails responded with: ', body);
  console.log('with headers: ', JWR.headers);
  console.log('and with status code: ', JWR.statusCode);

  // When you are finished with `io.socket`, or any other sockets you connect manually,
  // you should make sure and disconnect them, e.g.:
  io.socket.disconnect();

  // (note that there is no callback argument to the `.disconnect` method)
);

我所调查的内容:我已经深入研究了这些对象的各个级别,但似乎找不到任何可以使用的东西。并且简单地尝试 io.socket.emit() 因为它不存在。但是 io.socket.get() 和 io.socket.post() 等工作正常。

console.log(socketIOClient);
console.log(sailsIOClient);
console.log(io);
console.log(io.socket._raw);
console.log(io.sails);

谢谢,我会根据需要尝试更新以进行澄清。

更新

其他服务器信息。

我在端口 443 上使用 nginx,带有 SSL 终止,指向 4(和 很快更多)sails.js 实例在不同的端口(3000-3003)。 我还将 Redis 用于会话和套接字。

【问题讨论】:

我还没有找到解决方案。很高兴知道其他人是否遇到过这种情况。 你为什么要发io.socket.disconnect(); 我也在为此苦苦挣扎,我似乎可以找到解决方案。我想向服务器发送带有 json 消息的事件。 nodnarB 你能找到解决方法吗? 【参考方案1】:

你已经接近了:

您的 io.socket.get 调用有点像 rest api 调用。你需要一个风帆控制器绑定到 url '/hello' 上的 get 请求,

//client
io.socket.get('/hello', function serverResponded (body, JWR) 
  //this is the response from the server, not a socket event handler
  console.dir(body);//message:"hello"
);

config/routes.js:

'get /hello':'MyController.hello'


//controllers/MyController

  hello:function(req,res)
     res.json(message:"hello");
  

你要找的方法是,io.socket.on('eventName');

这是一个例子:

//client
    io.socket.get('/hello', function serverResponded (body, JWR) 
      //all we're doing now is subscribing to a room
      console.dir(body);
    );
    io.socket.on('anevent',function(message)
        console.dir(message);
    );


in 

    config/routes.js:
    
    'get /hello':'MyController.hello'
    

    //controllers/MyController
    
      hello:function(req,res)
         sails.sockets.join(req.socket,'myroom');
         res.json(message:'youve subscribed to a room');
      
    

我们实际上所做的是,将我们的套接字设置为“房间”的一部分,这基本上是一个事件命名空间。然后,其他一些控制器只需要这样做:

sails.sockets.broadcast('myroom','anevent',message:'socket event!');

调用完成后,你会在io.socket.on('anevent')的回调中收到消息。

【讨论】:

问题是如何将事件从浏览器发送到服务器。你所描述的,是从服务器发射到所有连接的客户端

以上是关于使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sails.JS 框架的 Node.JS -- Passport:没有在名称下注册策略:facebook

我可以根据每个请求更改数据库吗(Sails.js)

sails.js 和多个参数

Node.js / Express with vhost 与 Sails.js 框架应用程序冲突

如何在 Sails.js 中实现连接多方

使用 Node 8.9.4 LTS 安装 Sails.js 依赖项时,NPM“ENOENT:没有此类文件或目录错误”