2014-09-12 8 views
2

Я пытаюсь использовать socket.io с koa.js, и мне удалось подключить добавление server = require('http').createServer(koa.callback()).listen(port); и io = require('socket.io')(server); в самом низу моего приложения, но теперь я хочу испустить и, если возможно, прослушать к событиям от моего контроллера/маршрута. Каков наилучший способ реализации этого?Доступ к socket.io в koa route

Я попытался добавить io в свой контекст koa как koa.context.io = io и даже io.on('connection', function(socket){ koa.context.socket = socket });, но ничего не работает.

Спасибо заранее, ребята.

+0

Причина может быть из-за первоначального заказа: http://spathon.com/koa-js-and-socket-io/ –

ответ

0

Доступ к экземпляру 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> 
1

Я понимаю, что это немного поздно на поглощение, и может считаться немного эгоистичная, как я собираюсь предложить один из моих собственных модулей, но вы на правильном пути, добавив его в приложение, с Koa v2 это проще, поскольку контекст передается прямо, но с v1 вы можете привязать его к this, так как промежуточное программное обеспечение koa привязаны к экземпляру приложения.

В качестве альтернативы, я написал модуль, который поможет с этим точным прецедентом, https://github.com/mattstyles/koa-socket, он делает всего 2 вещи в настоящее время (и, вероятно, навсегда): он добавляет экземпляр сервера socket.io в контекст и позволяет писать koa-стиле для ваших слушателей сокетов.

+0

Мэтт! Я фактически использую ваш модуль прямо сейчас. :) У меня возникли проблемы, хотя из-за неудачных запросов на опрос. Это связано с тем, что socket.io не правильно привязан к экземпляру приложения koa? Я застрял: p – Askdesigners

+0

Привет @Askdesigners, если это связано с модулем, вы можете открыть проблему с несколькими подробностями, и мы можем попытаться ее исправить. –

+0

спасибо, что я сделал проблему :) – Askdesigners

 Смежные вопросы

  • Нет связанных вопросов^_^