使用 koa 和 socket.io 提供静态页面和聊天消息
using koa and socket.io to serve static pages and chat messages
我正在使用 koa 和 socket.io 为静态 html 页面提供服务并处理发送到套接字的聊天消息。以下代码用作服务器:-
var app = require('koa')();
var router = require('koa-router')();
var views = require('co-views');
var render = views('.', { map: { html: 'swig' }});
<--- [1]
router.get('/', function *(next) {
console.log('index.html');
this.body = yield render('index.html');
});
app.use(router.routes());
var server = require('http').createServer(app.callback()); <--- [2]
var io = require('socket.io')(server); <--- [3]
io.on('connection', function(socket) {
socket.on('chat message', function(msg, callback) {
console.log('got message - ' + msg);
io.emit('chat message', msg);
if (callback) {
callback();
}
});
});
server.listen(8080);
我的问题是;如果我将 [2] 和 [3] 移动到 [1] 并设置服务器的其余部分,则 get 路由器将不起作用。
有人知道为什么吗?
以下是客户端代码:-
var io = require('socket.io-client');
var socket = io('http://localhost:8080');
socket.on('connect', function() {
console.log('socket connected');
socket.emit('chat message', 'hello world !!!!!!', function() {
console.log('emit');
socket.close();
});
});
socket.on('disconnect', function() {
console.log('socket disconnect');
});
当您调用 app.callback()
时,将创建一个用于处理 HTTP 请求的回调函数。根据 Koa 源代码,看起来中间件堆栈在创建时被加载到回调中。因此,在创建回调后,将不会使用通过 use()
方法添加到堆栈的任何其他中间件。
遵循相同的逻辑;如果您使用的是 Koa listen()
方法,则需要在所有使用 Koa use()
方法之后调用它。否则这些中间件实际上不会在服务器正在使用的中间件堆栈上。
我正在使用 koa 和 socket.io 为静态 html 页面提供服务并处理发送到套接字的聊天消息。以下代码用作服务器:-
var app = require('koa')();
var router = require('koa-router')();
var views = require('co-views');
var render = views('.', { map: { html: 'swig' }});
<--- [1]
router.get('/', function *(next) {
console.log('index.html');
this.body = yield render('index.html');
});
app.use(router.routes());
var server = require('http').createServer(app.callback()); <--- [2]
var io = require('socket.io')(server); <--- [3]
io.on('connection', function(socket) {
socket.on('chat message', function(msg, callback) {
console.log('got message - ' + msg);
io.emit('chat message', msg);
if (callback) {
callback();
}
});
});
server.listen(8080);
我的问题是;如果我将 [2] 和 [3] 移动到 [1] 并设置服务器的其余部分,则 get 路由器将不起作用。
有人知道为什么吗?
以下是客户端代码:-
var io = require('socket.io-client');
var socket = io('http://localhost:8080');
socket.on('connect', function() {
console.log('socket connected');
socket.emit('chat message', 'hello world !!!!!!', function() {
console.log('emit');
socket.close();
});
});
socket.on('disconnect', function() {
console.log('socket disconnect');
});
当您调用 app.callback()
时,将创建一个用于处理 HTTP 请求的回调函数。根据 Koa 源代码,看起来中间件堆栈在创建时被加载到回调中。因此,在创建回调后,将不会使用通过 use()
方法添加到堆栈的任何其他中间件。
遵循相同的逻辑;如果您使用的是 Koa listen()
方法,则需要在所有使用 Koa use()
方法之后调用它。否则这些中间件实际上不会在服务器正在使用的中间件堆栈上。