我整个下午一直盯着node.js和socket.io示例,我正在尝试拼凑一个简单的页面,告诉我有多少用户已经连接到服务器。
我已经阅读了http://socket.io/上的文档以及这里的一些教程/问题,这些教程/问题概述了我正在尝试做的事情。我还发现create simple node js server and client对我没有帮助。
版本信息:
node.js - 0.6.15
快递 - 3.0.0alpha1
socket.io - 0.9.5(socket.io-client是相同的版本,但是找不到资源...请参阅注释)
ejs - 0.7.1
这是我的服务器代码:
var express = require('express'),
config = {
port: 4000,
hostname: 'localhost'
};
var server = module.exports = express.createServer();
/* server configuration */
server.use(express.cookieParser('keyboard unicorn'));
server.use(express.bodyParser());
server.use(express.methodOverride());
server.use(express.session({ secret: 'keyboard unicorn' }));
server.engine('.html', require('ejs').__express);
server.set('views', __dirname + '/lib/views');
server.set('view options', { layout: false });
server.set('view engine', 'html');
server.use(server.router);
server.use('/', express.static(__dirname + '/lib/assets'));
var io = require('socket.io').listen(server);
var connections = { 'length': 0 };
io.sockets.on('connection', function(socket) {
socket.__fd = socket.fd;
connections[socket.__fd]=socket.remoteAddress;
++connections.length;
console.log('user connected! There are a total of ' + connections.length + ' users online.');
return socket.on('disconnect',function(){
delete conns[socket.__fd];
--connections.length;
console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.');
});
});
server.get('/', function( req, res ) {
res.render('index', {
'page_title': 'sample application',
'number_of_connections': connections.length
});
});
server.listen(config.port, config.hostname);
这是我的客户代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><%= page_title %></title>
</head>
<body>
<div>There is a total of <%= number_of_connections %> user(s) connected.</div>
<script src="http://cdn.socket.io/stable/socket.io.js"></script>
<script type="text/javascript">
var socket = new io.Socket('localhost',{'port':4000});
socket.connect();
socket.on('connect', function() {
console.log('connected');
});
</script>
</body>
</html>
以下是我运行服务器并与客户端连接时发生的情况。
$ node server.js
info - socket.io started
然后当我在我的网络浏览器上导航到localhost:4000时,我得到的页面为'0'(number_of_connections)。此外,我在服务器的终端中看不到任何内容(开启。('连接'永远不会被命中)。
在客户端上,经过一两秒钟后,我开始收到大量错误(如果我让控制台打开几秒钟会导致页面崩溃),请参阅下图:
请,任何有关从哪里开始调试的帮助将不胜感激!我只是想让这个基本的例子运行起来,所以我可以开始玩/了解nodejs和socket.io!
答案 0 :(得分:16)
问题在于Express现在是一个功能。
您需要执行以下操作:
var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);
答案 1 :(得分:5)
Express 3.0.0alpha和socket.io不是(直接)兼容的,因为Express * 2.和3. *之间的变化(或者更确切地说,1. *和2. *之间的连接变化)。我建议你暂时降级到Express 2.5.9,或者你可以关注Express'作者TJ Holowaychuk的this advice。
答案 2 :(得分:4)
我设置了一个测试环境,安装了express 3.0和socket.io 0.9.5,并重现了你的错误。
然后我运行了npm install express@2.5.1
根据migration guide进行了几次向后调整,并且运行得很好。
所以我要继续并建议socket.io可能与express 3不兼容,但它仍然看起来很不稳定。
我的app.js针对快递2进行了调整:
var express = require('express'),
config = {
port: 8080,
hostname: 'localhost'
};
var server = module.exports = express.createServer();
/* server configuration */
server.set('views', __dirname + '/lib/views');
server.set('view options', { layout: false });
server.set('view engine', 'ejs');
//server.register('.html', 'ejs');require('ejs').__express);
server.use(express.cookieParser('keyboard unicorn'));
server.use(express.bodyParser());
server.use(express.methodOverride());
server.use(express.session({ secret: 'keyboard unicorn' }));
server.use('/', express.static(__dirname + '/lib/assets'));
server.use(server.router);
var io = require('socket.io').listen(server);
io.set('log level', 2);
var connections = { 'length': 0 };
server.get('/', function( req, res ) {
res.render('index', {
'page_title': 'sample application',
'number_of_connections': connections.length
});
});
io.sockets.on('connection', function(socket) {
socket.__fd = socket.fd;
connections[socket.__fd]=socket.remoteAddress;
++connections.length;
console.log('user connected! There are a total of ' + connections.length + ' users online.');
return socket.on('disconnect',function(){
delete conns[socket.__fd];
--connections.length;
console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.');
});
});
server.listen(config.port);
我的index.ejs文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><%= page_title %></title>
</head>
<body>
<div>There is a total of <%= number_of_connections %> user(s) connected.</div>
<!--<script src="http://cdn.socket.io/stable/socket.io.js"></script>-->
<script src='/socket.io/socket.io.js'></script>
<script type="text/javascript">
var socket = io.connect('http://hostname.com:8080');
socket.on('connect', function() {
console.log('connected');
});
</script>
</body>
</html>
我希望这里有所帮助。
答案 3 :(得分:0)
使用
替换app.use(express.bodyParser());
app.use(express.json());
app.use(express.urlencoded());
...保存文件,重启节点服务器。