Создать событие с клиентом сокета node.js для sails.js (0.11.x)

Сервер: sails.js (0.11.x) является сервером

Клиент: скрипт node.js с sails.io@0.11.5 и socket.io-client@1.3.5

Большая картина: у меня есть или будет ферма сценариев node.js, которые подключаются к серверу sails.js и выполняют различные задачи.

Ближайшая цель: я хочу, чтобы во время подключения через сокет от клиента-> сервера происходило событие, такое как:

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

Зачем? Если это возможно, я могу создать различные обработчики событий на стороне сервера в одном контроллере (или контроллере + службе) и поддерживать мой код в чистоте, одновременно управляя набором транзакций с отслеживанием состояния между конечными точками клиент / сервер для поддержки этой фермы сценариев.

Документация: Вот как можно использовать socket.io-client для 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);

Спасибо, и я постараюсь обновить это по мере необходимости для уточнения.

ОБНОВЛЕНИЕ:

Информация о разных серверах.:

  • Я использую nginx на порту 443, с завершением SSL, указывая на 4 (и вскоре больше) экземпляров sails.js на отдельных портах (3000-3003).
  • Я также использую Redis для сессий и сокетов.

1 ответ

Ты рядом

Ваш вызов io.socket.get похож на вызов остальных API. Вам нужен контроллер паруса, связанный с запросом get по URL '/hello',

//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').

Другие вопросы по тегам