nodejs socket.io cannot connect to server?

后端 未结 4 1805
别那么骄傲
别那么骄傲 2020-12-28 19:30

I\'ve been staring at node.js and socket.io examples all afternoon and i\'m trying to piece together a simple page that will tell me how many users I have connected to the s

相关标签:
4条回答
  • 2020-12-28 19:53

    replace app.use(express.bodyParser());, with

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

    ...save file, restart node server.

    0 讨论(0)
  • 2020-12-28 19:54

    The problem is because of Express now being a function.

    You need to do the following:

    var express = require('express');
    var app = express();
    var server = app.listen(3000);
    
    var io = require('socket.io').listen(server);
    
    0 讨论(0)
  • 2020-12-28 19:56

    Express 3.0.0alpha and socket.io are not (directly) compatible, due to changes in Express between 2.* and 3.* (or rather, changes in Connect between 1.* and 2.*). I would recommend you to downgrade to Express 2.5.9 for the time being, or you can follow this advice from Express' author, TJ Holowaychuk.

    0 讨论(0)
  • 2020-12-28 20:06

    I set up a test environment, installed express 3.0 and socket.io 0.9.5, and reproduced your error.

    Then I ran npm install express@2.5.1 made a couple backwards tweaks based on the migration guide, and it ran great.

    So I'm going to go ahead and suggest that socket.io is probably not compatible with express 3 yet, which still looks pretty unstable.

    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);
    

    My index.ejs file:

    <!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>
    

    I hope something here helps.

    0 讨论(0)
提交回复
热议问题