SocketIO- GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1418187395022-0 404 (не найден)

Я использую socketIO с экспрессом.

В моем проекте у меня есть страница входа и домашняя страница. Когда я делаю успешный вход в систему, я перехожу к localhost:3000/home, где я получаю эту ошибку:

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

Я не делал никаких изменений в моем app.js(проект, созданный Express).

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;

Я получаю эту ошибку всякий раз, когда я перехожу к localhost:3000/home. Я новичок как в socketIO, так и в экспрессе. Пожалуйста, скажите мне, если я что-то упустил.

Спасибо

РЕДАКТИРОВАТЬ:

В моем layout.jade я определил socketio так:

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

4 ответа

Решение

Если вы используете Express 4, мне кажется, что вам не хватает строк кода:

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

Это запустит ваш веб-сервер и установит порт 3000. См. Простое приложение Express 4 здесь: http://expressjs.com/4x/api.html

И затем, чтобы запустить socket.io, вы должны добавить:

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

И нет необходимости в этой строке:

var http = require('http');

Так как я боролся с этой проблемой в течение последних 5 часов. И это первый результат в Google.

Конечно, его 2015 год и часть кода изменились.

Я думаю, что в настоящее время лучшее начало кода index.js:

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

Порядок очень важен.

Моя проблема была в том, что все было установлено правильно, и узел слушал. Однако example.com/socket.io/socket.io.js и example.com/socket.io/?eio=... был найден 404. Однако, когда я попробовал example.com:3000/socket.io/socket.io.js, все заработало. Итак, теперь встал вопрос, как изменить запрос getJSON, чтобы иметь часть порта.

Поэтому решение было отредактировать main.js, который добавляется в index.html, где находится ваш чат. Есть:

var socket = io();

подлежит замене на

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

Это исправляет URL запросов getJSON и добавляет правильный порт и не более 404. Я надеюсь, что это поможет кому-то в будущем.

Пожалуйста, измените ваш конфиг на этот

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

Вот как я решаю это на стороне сервера (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 (сервер);

На стороне клиента

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

Это может выглядеть легко, но я потратил часы, прежде чем нашел решение, так как вышеупомянутые решения не работали для меня

Для всех, кто делает это с прокси nginx к node.js, проблема может заключаться в conf nginx, а не в коде node.js.

Вы можете проверить с помощью запроса GET (используйте curl, Postman или браузер) на http://localhost/socket.io/ (с завершающей косой чертой) и один на http://localhost:3000/socket.io/

Если http://localhost/socket.io/ выдает 404 not found или "Cannot GET /", но http://localhost:3000/socket.io/ возвращает ответ, подобный следующему:

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

Затем работают backend node.js и socket.io, но nginx неправильно передает запрос.

Проверьте, что это должно выглядеть примерно так:

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

В частности, обратите внимание, что в конце proxy_pass http://127.0.0.1:3000, поскольку мы хотим передать исходный URI запроса как есть (т.е. включая /socket.io).

Из документации nginx proxy_pass:

Если директива proxy_pass указана с помощью URI, то при передаче запроса на сервер часть нормализованного URI запроса, соответствующая местоположению, заменяется на URI, указанный в директиве:

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

Если proxy_pass указан без URI, URI запроса передается на сервер в той же форме, что и отправленный клиентом при обработке исходного запроса, или полный URI нормализованного запроса при обработке измененного URI:

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

Требования к заголовку описаны по адресу https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/ (по сути, для websocket требуется заголовок Upgrade, для которого требуется HTTP/1.1)

Просто вызовите прослушивание сервера и с помощью обратного вызова я передал экземпляр сервера в модуль.

часть bin/www файл из экспресс-приложения

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

и вот как мой модуль сокета socket.js

var io = {};

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

все слушатели сокета и испускают управление отсюда.

Другие вопросы по тегам