web-dev-qa-db-fra.com

La connexion Socket.io revient à l'interrogation, ne déclenche jamais le gestionnaire de «connexion»

J'essaie d'ajouter socket.io à mon application node.js existante sur express. J'ai ajouté la bibliothèque socket.io du côté serveur comme suit (directement après http://socket.io/get-started/chat/ ):

var express = require('express')
    , http = require('http')
    , path = require('path')
    , fs = require('fs');

var app = express();
var http = http.Server(app);
var io = require('socket.io')(http);

// Express settings [...]
// Express routes [...]

// Socket.io Communication
io.on('connection', function(socket) {
  console.log('a user connected');
});


// Start server
app.listen(config.port, function () {
  console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});

En ce moment, sur le front-end, je fais simplement une connexion:

<script src="/socket.io/socket.io.js"></script>
<script>
  var io = io();
</script>

Mais au lieu d'afficher "un utilisateur connecté" dans la console, la console enregistre un flux continu de sondages. J'utilise la dernière version de Chrome sur Mac, qui prend en charge les websockets.

GET /socket.io/?EIO=2&transport=polling&t=1402521519446-91 200 94ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519447-92 200 93ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519485-93 200 53ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519580-94 200 143ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519582-95 200 144ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519633-96 200 40ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519778-97 200 92ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519780-98 200 92ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519818-99 200 36ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519912-100 200 81ms - 6.96kb
[etc]

Je dois faire quelque chose de mal. Je suis assez nouveau dans ce domaine et j'aimerais être orienté dans la bonne direction. Faites-moi savoir si j'ai besoin de développer une partie de cette question.

Merci! - Edward

===========

ÉDITER:

Voici les paramètres express que j'utilise actuellement. J'ai essayé les mêmes étapes sur une toute nouvelle application de nœud et cela semblait bien fonctionner, donc je me demande si cela pourrait être le problème.

app.configure('development', function(){
    app.use(require('connect-livereload')());

    // Disable caching of scripts for easier testing
    app.use(function noCache(req, res, next) {
        if (req.url.indexOf('/scripts/') === 0) {
            res.header('Cache-Control', 'no-cache, no-store, must-revalidate');
            res.header('Pragma', 'no-cache');
            res.header('Expires', 0);
        }
        next();
    });

    app.use(express.bodyParser({limit: '50mb'})); // increase limit for audio recordings
    app.use(express.static(path.join(config.root, '.tmp')));
    app.use(express.static(path.join(config.root, 'app')));
    app.use(express.errorHandler());
    app.use(express.logger('dev'));

    util.logger.add(loggly, { 
        [...Credentials...]
    });
    app.set('views', config.root + '/app/views');
});
23
Edward Sun

J'ai eu le même problème et la façon dont je l'ai résolu en remplaçant ce

// Start server
app.listen(config.port, function () {
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});

avec ça:

// Start server
http.listen(config.port, function () {
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});

Ce message explique un peu pourquoi: https://stackoverflow.com/a/17697134/15151

31
Toni