Socket.io la connexion revient à l'interrogation, ne déclenche jamais le gestionnaire 'connection'

J'essaie d'ajouter socket.io à mon nœud existant.application js sur express. J'ai ajouté le socket.io bibliothèque côté serveur comme suit (suivant directement 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 à cela et j'aimerais être pointé dans la bonne direction. Faites-moi savoir si j'ai besoin d'élaborer sur une partie de cette question.

Merci! - Edward

===========

Modifier:

Voici les paramètres express que j'utilise actuellement. J'ai essayé les mêmes étapes sur une application de nœud complètement nouvelle et cela semblait fonctionner correctement, 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
demandé sur Musa 2014-06-12 01:30:20

2 réponses

J'ai eu le même problème et la façon dont je l'ai résolu était 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 ceci:

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

Ce post explique un peu pourquoi: https://stackoverflow.com/a/17697134/1515130

30
répondu Toni 2017-05-23 11:54:23

Je ne sais pas, si c'est votre problème, mais mon œil est resté sur votre balise de script html, avec ce chemin source du js.

<script src="/socket.io/socket.io.js"></script>

Je pense que la gestion des dossiers n'est pas correcte. Il devrait être:

<script src="./socket.io/socket.io.js"></script>

Ou peut-être:

<script src="socket.io/socket.io.js"></script>

Parce que, à mon avis, le " / " au début fait référence au dossier racine. Le "./ "fait référence au répertoire courant et au suivant, mais simplement le nom du dossier et ensuite le js à l'intérieur devraient faire l'affaire.

Donc, votre code de nœud est correct, mais le client côté html n'inclut pas votre script.

-8
répondu BarneyK 2014-06-12 07:30:09