将node.js套接字客户端的事件发送到sails.js(0.11.x)

时间:2015-06-04 21:11:42

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

服务器: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);

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

文档:这就是为每个sails文档使用socket.io-client for sails.js的方法: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进行会话和套接字。

1 个答案:

答案 0 :(得分:3)

你很亲密:

你的io.socket.get电话有点像休息api电话。你需要一个与url'/ hello',

上的get请求绑定的sails控制器
//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"}
});

in

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')的回调中收到消息。