Socket.io 访问膝关节炎中的SOCKE.IO

Socket.io 访问膝关节炎中的SOCKE.IO,socket.io,socket.io-1.0,koa,Socket.io,Socket.io 1.0,Koa,我尝试使用SokKo.IO和Ko.js,我可以连接添加 Server =要求(“HTTP”)。createServer(膝关节炎。code>和io=require('socket.io')(服务器)在我的应用程序的最底部,但现在我想发出并在可能的情况下侦听来自控制器/路由的事件。实现这一点的最佳方式是什么 我尝试在我的膝关节炎上下文中添加 IO < /> >,如 Ko.CordEx.IO=IO,甚至 IO。(连接)函数(Socket){Koa. CordEx.Socket=Socket };但什

我尝试使用SokKo.IO和Ko.js,我可以连接添加<代码> Server =要求(“HTTP”)。createServer(膝关节炎。code>和
io=require('socket.io')(服务器)在我的应用程序的最底部,但现在我想发出并在可能的情况下侦听来自控制器/路由的事件。实现这一点的最佳方式是什么

我尝试在我的膝关节炎上下文中添加<代码> IO < /> >,如<代码> Ko.CordEx.IO=IO,甚至<代码> IO。(连接)函数(Socket){Koa. CordEx.Socket=Socket };<代码>但什么都不起作用


提前感谢各位。

访问您的膝关节炎路径中的SokKo.IO实例不起作用。

创建socket.io实例取决于应用程序创建http服务器可以使用的回调函数

var server = http.createServer(app.callback());
var io = require('socket.io')(server);
此回调是在co的帮助下生成的,要求您的应用程序已使用所有中间件/路由进行设置。(见附件)。因此,您不能在这些路由中使用socket.io实例(随后创建)

此外,我认为它不打算在控制器中发出socket.io事件。如果要将数据发送回调用控制器的客户端,则应在该控制器生成的响应中执行此操作。如果要在服务器上发出更多事件,可以通过发出服务器将接收的事件从客户端触发这些事件。这样,您就可以处理您传递给 Socket的函数中的客户端数据。(…)< /Cord>,不需要在控制器/路由中实现膝关节炎。

这里是第二种情况的例子,没有任何膝关节炎控制器/路径。 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>

koa-socket.io
变量套接字=io('http://localhost:3000');
socket.on('news',函数(数据){
log('接收到数据为的新闻:');
控制台日志(数据);
});
函数myclick(){
控制台日志(“单击”);
emit('click',{clickdata:'i clicked the button'});
}
单击我并在服务器和浏览器中查看控制台。

我意识到这是一个有点晚的摄取,并且可以被认为是有点自私,因为我要提出一个我自己的模块,但是,你在正确的轨道上,把它附加到应用程序,用膝关节炎V2这是更容易的,因为上下文是通过,但用V1你可以钉它到代码>这个< /代码>,由于膝关节炎的中间件绑定到应用程序实例。


或者,我编写了一个模块来帮助解决这个确切的用例,它目前(可能永远)只做两件事:它将socket.io服务器实例附加到上下文中,并允许您为套接字侦听器编写koa风格的中间件。

原因可能是因为初始化顺序:Matt!我现在实际上正在使用您的模块。:)但是我遇到了麻烦,因为最初的轮询请求失败了。这是由于Soko.IO没有正确地加入我的膝关节炎应用程序实例吗?我被卡住了:pHi@Askdesigners,如果它与模块相关,你能用更多的细节打开一个问题,我们可以试着修复它吗