13

私は午後中ずっと node.js と socket.io の例をじっと見ていて、サーバーに接続したユーザーの数を示す簡単なページをまとめようとしています。

http://socket.io/のドキュメントと、私がやろうとしていることを正確に概説するいくつかのチュートリアル/質問を読みました。シンプルなノード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

次に、Web ブラウザーで localhost:4000 に移動すると、「0」(number_of_connections) のページが表示されます。また、サーバーのターミナルには何も表示されません (on.('connection' はヒットしません)。

クライアントでは、1 ~ 2 秒後に膨大な数のエラーが発生し始めます (コンソールを数秒間開いたままにしておくと、ページがクラッシュします) 下の画像を参照してください。

ここに画像の説明を入力

これをデバッグするためにどこから始めるべきかについての助けをいただければ幸いです! nodejs と socket.io を使って遊んだり、理解したりできるように、この基本的な例を起動して実行したいだけです。

4

4 に答える 4

21

問題は、Express が関数になったためです。

次のことを行う必要があります。

var express = require('express');
var app = express();
var server = app.listen(3000);

var io = require('socket.io').listen(server);
于 2012-04-21T13:54:33.627 に答える
6

Express 3.0.0alpha と socket.io は、2.* と 3.* の間で Express が変更されたため (または、1.* と 2.* の間で Connect が変更されたため)、(直接) 互換性がありません。とりあえず Express 2.5.9 にダウングレードするか、Express の作者である TJ Holowaychuk のアドバイスに従うことをお勧めします。

于 2012-04-17T22:32:24.190 に答える
4

テスト環境をセットアップし、express 3.0 と socket.io 0.9.5 をインストールして、エラーを再現しました。

次に、移行ガイドnpm install express@2.5.1に基づいていくつかの後方調整を行いましたが、うまくいきました。

したがって、socket.io はおそらくまだ Express 3 と互換性がなく、かなり不安定に見えることを示唆します。

Express 2 用に微調整された app.js:

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>

ここで何かが役立つことを願っています。

于 2012-04-17T22:47:35.140 に答える
0

app.use(express.bodyParser());を置き換える

app.use(express.json());
app.use(express.urlencoded());

...ファイルを保存し、ノード サーバーを再起動します。

于 2014-01-29T17:54:36.797 に答える