Вызов события socket.io из обработчика Restify

У меня есть сервер resitfy и сервер socketio, настроенные в соответствии с примером здесь. Мое требование - вызвать событие socket.io из обработчика. Итак, мой код выглядит так:

var restify = require('restify');
var socketio = require('socket.io');

var server = restify.createServer();

server.get('/', function (req, res, next) {
  res.json(204, null);
  io.emit("sample", {"sample":"event"});
  next();
});

server.listen(8080, function () {
    console.log('socket.io server listening at %s', server.url);
});

Мой клиентский код довольно прост и выглядит так:

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Socket.IO Chat Example</title>
</head>
<body>
  <script src="socket.io.js"></script>
  <script type="text/javascript">
    var socket = io.connect('http://localhost:8080');
    socket.on('sample', function (data) {
      console.dir(data);
    });
  </script>
</body>
</html>

Когда я запускаю сервер, сервер существует после первого подключения клиента, и это можно найти в журналах:

  socket.io:server initializing namespace / +0ms
  socket.io:server creating engine.io instance with opts {"path":"/socket.io"} +3ms
  socket.io:server attaching client serving req handler +1ms
socket.io server listening at http://0.0.0.0:8080
  socket.io:server incoming connection with id U9hLZRlbsGfvI8QPAAAA +2s
  socket.io:client connecting to namespace / +4ms
  socket.io:namespace adding socket to nsp / +0ms

http.js:690
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)
    at ServerResponse.format (/home/vagrant/socket.io-server-example/node_modules/restify/lib/response.js:109:10)
    at ServerResponse.send (/home/vagrant/socket.io-server-example/node_modules/restify/lib/response.js:231:24)
    at emitRouteError (/home/vagrant/socket.io-server-example/node_modules/restify/lib/server.js:152:13)
    at onRoute (/home/vagrant/socket.io-server-example/node_modules/restify/lib/server.js:610:21)
    at Router.find (/home/vagrant/socket.io-server-example/node_modules/restify/lib/router.js:512:5)
    at Server._route (/home/vagrant/socket.io-server-example/node_modules/restify/lib/server.js:604:21)
    at routeAndRun (/home/vagrant/socket.io-server-example/node_modules/restify/lib/server.js:572:14)
    at Server._handle (/home/vagrant/socket.io-server-example/node_modules/restify/lib/server.js:592:9)
    at Server.onRequest (/home/vagrant/socket.io-server-example/node_modules/restify/lib/server.js:255:14)

Чего я не могу понять, так это того, как я могу обслуживать события REST API и socket.io из одного и того же порта, используя restify? Почему restify жалуется на невозможность установить заголовки после их отправки?

Я упускаю здесь что-то фундаментальное?


person Venkat    schedule 05.08.2015    source источник


Ответы (1)


Попробуйте использовать этот пример

Передайте результат из метода listen в socketio, а затем используйте экземпляр io для отправки этих событий вашим обработчикам.

var restify = require('restify');

var server = restify.createServer();

var app = server.listen(8080, function() {
  console.log('%s listening at %s', server.name, server.url);
});

var io = require("socket.io")(app);

function respond(req, res, next) {
  res.send('hello ' + req.params.name);

  io.emit('sample',{"data":"hello from server."});

  next();
}

server.get('/hello/:name', respond);
server.head('/hello/:name', respond);

io.on('connection', function(socket){
    console.log('new connection');
});
person BlaShadow    schedule 06.08.2015