it-swarm.com.de

SocketIO- GET http: // localhost: 3000/socket.io /? EIO = 3 & transport = polling & t = 1418187395022-0 404 (nicht gefunden)

Ich verwende socketIO mit express. 

In meinem Projekt habe ich eine Login-Seite und eine Homepage .. Wenn ich mich erfolgreich anmelde, gehe ich zu localhost: 3000/home, wo ich diese Fehlermeldung bekomme:

GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1418187395022-0 404 (Not Found)

Ich habe keine Änderungen an meinen app.js vorgenommen (Projekt wurde von express erstellt).

Index.js:

var express = require('express');
var router = express.Router();
var http = require('http');
var fs = require('fs');
var io = require('socket.io')(http);
/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

router.get('/home', function(req, res) {
  res.render('home', { title: 'Express' });
});

io.on('connection', function(socket){
    console.log("User Connected");
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    console.log("Message");
  });
   socket.on('disconnect', function(msg){
    console.log("User DisConnected");
  });

});

router.post('/authenticate', function(req, res) {
    fs.readFile("./public/Verification/Users.json", "utf8", function (err, data) {
        if (err) 
            console.log(err);
        else{
            var result = JSON.parse(data);
            for(var i=0;i<result.Users.length;i++){
                if(req.body.username == result.Users[i].username && req.body.password ==     result.Users[i].password){
                    console.log("Success!!!!!!!!!!!!!!");
                    res.location("home");
                    res.redirect("home");
                }
            }
        }
        });
});

module.exports = router;

Ich erhalte diese Fehlermeldung, wenn ich zu localhost navigiere: 3000/home. Ich bin neu bei SocketIO und express . Bitte sagen Sie mir, wenn mir etwas fehlt.

Vielen Dank

EDIT:

In meinem layout.jade habe ich socketio folgendermaßen definiert:

script(src='https://cdn.socket.io/socket.io-1.2.0.js')
35
Zee

Wenn Sie Express 4 ausführen, scheint mir, als würden Sie die Codezeilen vermissen:

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

Dadurch wird Ihr Webserver gestartet und auf Port 3000 gesetzt. Sehen Sie sich die einfache Express 4-App für Knochen hier an: http://expressjs.com/4x/api.html

Zum Starten von socket.io würden Sie Folgendes hinzufügen:

var io = require('socket.io').listen(server);

Und diese Zeile ist nicht erforderlich:

var http = require('http');
55
jfriend00

Da habe ich die letzten 5 Stunden mit diesem Thema gekämpft. Und das ist das erste Ergebnis bei Google.

Natürlich haben sich 2015 und ein Teil des Codes geändert.

Ich denke, der beste Start des index.js-Codes ist derzeit:

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

server.listen(3000);

Die Reihenfolge ist sehr wichtig.

Mein Problem war, dass alles richtig installiert war und der Knoten lauschte. Das Beispiel example.com/socket.io/socket.io.js und example.com/socket.io/?eio = ... wurde jedoch nicht gefunden 404. Wenn ich jedoch example.com:3000/socket versuchte .io/socket.io.js alles hat funktioniert. Nun war die Frage, wie man die getJSON-Abfrage so ändern kann, dass sie den Portteil hat.

Die Lösung bestand also darin, die main.js zu bearbeiten, die zur index.html hinzugefügt wird, in der sich Ihr Chat befindet.

var socket = io();

ersetzt werden mit

var socket = io.connect('http://example.com:3080');

Dies korrigiert die getJSON-Abfrage-URL und fügt den richtigen Port und nicht mehr 404 hinzu. Ich hoffe, es hilft jemandem in der Zukunft.

29

So löse ich es auf der Serverseite (2018):  

const app = express();
const socketIO = require('socket.io');

const server = express()
  .use(app)
  .listen(PORT, () => console.log(`Listening Socket on ${ PORT }`));

const io = socketIO(server);

Auf Kundenseite  

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js"></script>

Es sieht einfach aus, aber ich habe Stunden gebraucht, um die Lösung zu finden, da die obigen Lösungen für mich nicht funktionierten.

2

Bitte ändern Sie Ihre Konfiguration in diese

var express = require('express');

// App setup
var app = express();
var socket = require('socket.io')

var server = app.listen(4000, function(){
    console.log('listening for requests on port 4000,');
});

let io = socket(server)
io.on('connection', function(socket){
  console.log(`${socket.id} is connected`);
});
1
IAMSTR

Für alle, die dies mit Nginx als Proxy für node.js tun, ist das Problem möglicherweise die nginx conf anstelle des node.js-Codes.

Sie können mit einer GET-Anforderung (verwenden Sie curl, Postman oder einen Browser) Folgendes testen: http: //localhost/socket.io/ (mit dem abschließenden Schrägstrich) und eins zu http://localhost:3000/socket.io/

Wenn http: //localhost/socket.io/ nicht gefunden oder "GET/nicht möglich" ergibt, wird http: // localhost: 3000/socket.io / zurückgegeben eine Antwort wie:

{"code":0,"message":"Transport unknown"}

Dann funktionieren das Backend node.js und socket.io, aber nginx leitet die Anfrage nicht korrekt weiter.

Überprüfen Sie, ob es ungefähr so ​​aussehen sollte:

location /socket.io/ {
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $Host;
                proxy_pass http://127.0.0.1:3000;
}

Beachten Sie insbesondere, dass am Ende von proxy_pass http://127.0.0.1:3000 Kein Schrägstrich steht, da der ursprüngliche Anforderungs-URI unverändert übergeben werden soll (d. H. /Socket.io wird eingeschlossen).

Aus den nginx proxy_pass docs :

Wenn die Anweisung proxy_pass mit einem URI angegeben wird, wird bei der Übergabe einer Anforderung an den Server der Teil einer normalisierten Anforderungs-URI, der mit dem Speicherort übereinstimmt, durch einen in der Anweisung angegebenen URI ersetzt:

location /name/ {
    proxy_pass http://127.0.0.1/remote/; } 

Wenn proxy_pass ohne URI angegeben wird, wird der Anforderungs-URI in derselben Form an den Server übergeben, wie er von einem Client bei der Verarbeitung der ursprünglichen Anforderung gesendet wurde, oder der vollständig normalisierte Anforderungs-URI wird bei der Verarbeitung der geänderten URI übergeben:

location /some/path/ {
    proxy_pass http://127.0.0.1; }

Die Header-Anforderungen werden unter https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/ behandelt. (Im Wesentlichen erfordert Websocket den Upgrade-Header, für den HTTP/1.1 erforderlich ist.)

0
Benitok

rufen Sie einfach das Listen des Servers auf und mit dem Callback habe ich die Serverinstanz an das Modul übergeben.

teil der bin/www-Datei aus der Express-App

var server = http.createServer(app);
server.listen(port, function () {
  console.log('app listening on *:' + port);
  require('../socket')(server);
  console.log('socket server will be on *:' + port);
});

server.on('error', onError);
server.on('listening', onListening);

und so ist mein Socket-Modul socket.js

var io = {};

module.exports = (server, serveradmin) => {
  io = require('socket.io')(server);
  io.on('connection', function (socket) {
    console.log(socket + ' a user connected');
  });
}

alle Socket-Listener und Emits verwalten von hier aus.

0
Subhash