在您的 koa 路由中访问 socket.io 实例应该不起作用。
创建 socket.io 实例取决于应用程序创建一个可供 http 服务器使用的回调函数。
var server = http.createServer(app.callback());
var io = require('socket.io')(server);
此回调是在 co 的帮助下生成的,并且要求您的应用程序已经设置了所有中间件/路由。(参见koa 源代码)。因此,您不能在这些路由中使用 socket.io 实例(随后创建)。
此外,我认为它不打算在您的控制器中发出 socket.io 事件。如果要将数据发送回调用控制器的客户端,则应在该控制器生成的响应中执行此操作。如果您想在服务器上发出更多事件,您可以通过发出服务器将接收的事件从客户端触发它们。这样,您可以在传递给的函数中处理来自客户端的数据,socket.on(...)
而无需在 koa 的控制器/路由中实现它。
这是第二种情况的示例,没有任何 koa 控制器/路由。
应用程序.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 + ' ...');
索引.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>