Question Le navigateur ne peut pas obtenir le fichier socket.io.js en utilisant express


J'ai des problèmes avec les exemples de socket.io. Mon navigateur ne peut pas obtenir le fichier socket.io.js (erreur 404 dans la console).


Code qui fonctionne:

server.js

var app = require('express').createServer()
  , io = require('socket.io').listen(81);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

index.html

<script src="http://192.168.1.104:81/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://192.168.1.104:81');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>


Mais celui-ci pas:

server.js

var app = require('express').createServer()
  , io = require('socket.io').listen(app);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

index.html

<script src="http://192.168.1.104:80/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://192.168.1.104:80');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

Dans ce cas, mon navigateur ne peut pas obtenir le fichier socket.io.js.


11
2018-04-17 07:43


origine


Réponses:


MODIFIER : tout le texte ci-dessous est erroné jusqu'au prochain "EDIT". Laissant là comme trace ...

Il y a une chose que vous devez savoir, deux choses à faire + tout ce dont vous avez besoin Express doc est ici :

  1. Express filtre / gère chaque accès à votre serveur de noeud. Cela signifie que lorsque vous essayez d'accéder à votre fichier de script socket.io, Express essaie de le trouver dans les routes que vous avez déclarées et échoue car vous ne l'avez pas fait (et vous avez eu raison de ne pas le faire).
  2. Le plus important: déclarer un dossier statique, non "calculé" dans Exprimez où vous allez mettre tous vos fichiers statiques (css, scripts clients, images):

    app.use('/static', express.static(__dirname + '/static'));

    Cette ligne doit être mise en vous app.configure appeler avant app.use(app.router) (Je l'ai mis en premier)

    J'aime avoir ceci / static / scripts; / statique / css; / static / img folder organisation mais vous êtes libre de vous adapter à vos besoins.

  3. Modifier le lien vers le fichier script socket.io vers un chemin relatif (optionnel mais fortement conseillé): src='/static/scripts/socket.io/socket.io.js'

MODIFIER : Je me trompe, très très mal et je suis désolé pour ça. Socket.io génère les différents chemins / fichiers nécessaires et vous n'avez pas à les déclarer ni à copier les fichiers de script client.

S'il vous plaît essayer de changer le <script src="http://192.168.1.104:81/socket.io/socket.io.js"></script> ligne client à la relation relative normale <script src="/socket.io/socket.io.js"></script> car c'est la seule différence entre votre code et le code du guide express.


7
2018-04-17 08:24



Quelle Version express Utilises-tu?

L’API est passée d’Express 2.x à 3.x, donc la réponse est dans le Compatibilité Socket.IO section à la Migration de 2.x à 3.x wiki:

Socket.IO's .listen() méthode prend un http.Server instance comme argument.
À partir de 3.x, la valeur de retour de express() n'est pas un http.Server exemple. Pour que Socket.IO fonctionne avec Express 3.x, assurez-vous de créer et de transmettre manuellement vos données. http.Server instance à Socket.IO .listen() méthode:

var app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);

6
2018-01-19 18:07