Ответ 1
Проблема заключается в том, что Express теперь является функцией.
Вам нужно сделать следующее:
var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);
Я смотрел на node.js и socket.io примеры весь день, и я пытаюсь собрать вместе простую страницу, которая расскажет мне, сколько пользователей я подключился к серверу.
Я прочитал документацию на http://socket.io/, а также несколько учебников/вопросов здесь, в которых точно указано, что я пытаюсь делать. Я также нашел создать простой node js-сервер и клиент, который мне не помогает.
Информация о версии:
node.js - 0.6.15
express - 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). Кроме того, я ничего не вижу в терминале для сервера (on. ( "Connection" никогда не попадает).
На клиенте, через секунду или два, я начинаю получать огромное количество ошибок (если я оставлю консоль открытой в течение нескольких секунд, она выйдет из строя на странице) см. изображение ниже:
Пожалуйста, любая помощь, с которой начать для отладки, была бы оценена! Я просто хочу, чтобы этот базовый пример работал и работал, поэтому я могу начать играть с/пониманием nodejs и socket.io!
Проблема заключается в том, что Express теперь является функцией.
Вам нужно сделать следующее:
var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);
Express 3.0.0alpha и socket.io не совместимы (напрямую) из-за изменений в Express между 2. * и 3. * (или, скорее, изменения в Connect между 1. * и 2. *). Я бы порекомендовал вам понизить до Express 2.5.9 на данный момент, или вы можете следовать этот совет от автора Express, TJ Holowaychuk.
Я установил тестовую среду, установил express 3.0 и socket.io 0.9.5 и воспроизвел вашу ошибку.
Затем я запустил npm install [email protected]
пару обратных настроек на основе руководства по миграции, и он отлично справился.
Итак, я собираюсь продолжить и предположить, что socket.io, вероятно, не совместим с express 3, но все еще выглядит довольно неустойчивым.
My app.js tweaked for express 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>
Надеюсь, что-то здесь поможет.
замените app.use(express.bodyParser());
,
app.use(express.json());
app.use(express.urlencoded());
... сохранить файл, перезагрузить сервер node.