Доступ к экземпляру socket.io в вашем маршруте koa не должен работать.
Создание экземпляра socket.io зависит от приложения, создающего функцию обратного вызова, которая может использоваться http-сервером.
var server = http.createServer(app.callback());
var io = require('socket.io')(server);
Этот обратный вызов генерируется с помощью сотрудничества и требует, чтобы ваше приложение уже установлено все промежуточное программное обеспечение/маршрутов. (см. koa source). Поэтому вы не можете использовать экземпляр socket.io (который создается впоследствии) в этих маршрутах.
Кроме того, я думаю, что это не значит, что вы выбрали события socket.io в своих контроллерах. Если вы хотите отправить данные обратно клиенту, который вызвал контроллер, вы должны сделать это в ответе, который генерируется этим контроллером. Если вы хотите опубликовать дополнительные события на сервере, вы можете инициировать их из клиента, испустив событие, которое получит сервер. Таким образом, вы можете обрабатывать данные от клиента в функции, которую вы передаете, до socket.on(...)
и не нуждаетесь в ее реализации в контроллере/маршрутах для koa.
Вот пример второго случая, без контроллера/маршрута koa.
app.js:
var http = require('http');
var koa = require('koa');
var app = koa();
var send = require('koa-send');
app.use(function* (next) {
if (this.path !== '/') return yield next;
yield send(this, __dirname + '/index.html');
});
var server = http.createServer(app.callback());
var io = require('socket.io')(server);
io.on('connection', function (socket) {
socket.on('click', function (data) {
//process the data here
console.log('client clicked! data:');
console.log(data);
// emit an event
console.log('responding with news');
socket.emit('news', { hello: 'world' });
});
});
var port = process.env.PORT || 3000;
server.listen(port);
console.log ('Listening at port ' + port + ' ...');
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>koa-socket.io</title>
</head>
<body>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('http://localhost:3000');
socket.on('news', function (data) {
console.log('received news with data: ');
console.log(data);
});
function myclick() {
console.log("click");
socket.emit('click', { clickdata: 'i clicked the button' });
}
</script>
<button type="button" onclick="myclick();">Click Me and watch console at server and in browser.</button>
</body>
</html>
Причина может быть из-за первоначального заказа: http://spathon.com/koa-js-and-socket-io/ –