node.js-SocketIO- GET [http:// localhost:3000 / socket.io /?EIO = 3&transport = polling&t = 1418187395022-0] 404(未找到)

我正在使用express的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和express都是陌生的。请告诉我我是否缺少什么。

谢谢

编辑:

在我的layout.jade中,我这样定义了socketio:

script(src='https://cdn.socket.io/socket.io-1.2.0.js')
Zee asked 2020-08-06T23:25:00Z
6个解决方案
67 votes

如果您运行的是Express 4,在我看来,您似乎缺少代码行:

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

这将启动您的Web服务器并将其设置为端口3000。请在此处查看简单的Express 4应用程序:[http://expressjs.com/4x/api.html]

然后,要启动socket.io,您需要添加:

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

并且,不需要此行:

var http = require('http');
jfriend00 answered 2020-08-06T23:25:19Z
30 votes

由于我在过去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 =...。但是,当我尝试example.com:3000/socket.io/socket.io.js时,一切正常。 现在是问题了,如何更改getJSON查询以包含端口部分。

因此,解决方案是编辑main.js,将其添加到聊天所在的index.html中。有:

var socket = io();

被替换

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

这将更正getJSON查询URL,并添加正确的端口,而不添加404。我希望它对以后的用户有所帮助。

Kalle H. Väravas answered 2020-08-06T23:26:10Z
1 votes

这就是我在服务器端解决问题的方式(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);

在客户端

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

看起来很简单,但是由于上述解决方案对我不起作用,因此我花了数小时才找到解决方案。

melshor essomassor answered 2020-08-06T23:26:39Z
1 votes

请更改您的配置

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

IAMSTR answered 2020-08-06T23:26:59Z
0 votes

只需调用服务器的监听,并通过回调将服务器实例传递给模块。

Express应用程序的socket.js文件的一部分

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

所有套接字侦听器,并从此处发出管理信息。

Subhash answered 2020-08-06T23:27:32Z
0 votes

对于使用nginx代理到node.js进行此操作的任何人,问题可能出在nginx conf而不是node.js代码上。

您可以使用GET请求(使用curl,Postman或浏览器)对[http://localhost/socket.io/](带有斜杠)进行测试,对[http:// localhost:3000 / socket.io]进行测试。 /]

如果[http://localhost/socket.io/]给出404找不到或“无法获取/”,但是[http:// localhost:3000 / socket.io /]返回如下响应:

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

然后后端的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;
}

特别要注意的是,在location /some/path/ { proxy_pass http://127.0.0.1; } 的末尾没有斜杠,因为我们想按原样传递原始请求URI(即,包括/socket.io)。

从nginx proxy_pass文档:

如果proxy_pass指令是使用URI指定的,则当 请求传递到服务器,这是规范化请求URI的一部分 匹配位置的位置将替换为伪指令中指定的URI:

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

如果指定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需要使用HTTP / 1.1升级头)

Benitok answered 2020-08-06T23:28:32Z
translate from https://stackoverflow.com:/questions/27393705/socketio-get-http-localhost3000-socket-io-eio-3transport-pollingt-1418187