【问题标题】:I am getting 404 with socket.io How to resolve this我用 socket.io 得到 404 如何解决这个问题
【发布时间】:2017-02-09 16:30:49
【问题描述】:

我是 node.js 的新手,我正在尝试设置 Socket.io,但它会像这样给出 404,

socket.io-1.4.7.js:1 GET http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LeZf0Tg 404 (Not Found)Request.create @ socket.io-1.4.7.js:1Request @ socket.io-1.4.7.js:1XHR.request @ socket.io-1.4.7.js:1XHR.doPoll @ socket.io-1.4.7.js:1Polling.poll @ socket.io-1.4.7.js:1Polling.doOpen @ socket.io-1.4.7.js:1Transport.open @ socket.io-1.4.7.js:1Socket.open @ socket.io-1.4.7.js:1Socket @ socket.io-1.4.7.js:1Socket @ socket.io-1.4.7.js:1Manager.open.Manager.connect @ socket.io-1.4.7.js:2(anonymous function) @ socket.io-1.4.7.js:3
socket.io-1.4.7.js:1 GET http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LeZf1h_ 404 (Not Found)

这是我的服务器端代码

var express = require("express");
var app = express();
var mongoose = require("mongoose");
var bodyParser = require("body-parser");
var config = require("./config/config");
var http    = require('http').Server(app);
var io      = require('socket.io')(http);

// configuration
mongoose.connect(config.database);

// template engine
app.set("view engine", "ejs");
app.engine("html", require("ejs").renderFile);
app.set("views", __dirname + "/../client/views");

// use
app.use(express.static("../client/public"));
app.use(express.static("../client/app"));
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
//app.use(morgan("dev"));



// Route handler for www requests
app.get('/*', function (req, res, next) {
    if (req.headers.host.match(/^www/) !== null) {
        res.redirect('http://' + req.headers.host.replace(/^www\./, '') + req.url);
    } else {
        next();
    }
});

app.use("/", require("./routes"));
app.use("/admin", require("./routes/admin"));
app.use("/test", require("./routes/testUser"));

var port = process.env.PORT || 9000;

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


var server = app.listen(port, function () {
    var host = server.address().address;
    var port = server.address().port;

    console.log("app listening on " + host + " " + port);
});

我的客户端我正在使用 Ejs 模板引擎来创建 Socket 连接

<html>
<body>
    <p class="dancing">Simple Blog</p>

    <div class="social-icons">
        <a href="https://twitter.com" target="_blank">
            <i class="fa fa-twitter-square"></i>
        </a>
        <a href="https://github.com/" target="_blank">
            <i class="fa fa-github-square"></i>
        </a>
        <a href="https://www.linkedin.com" target="_blank">
            <i class="fa fa-linkedin-square"></i>
        </a>
        <a href="https://www.facebook.com" target="_blank">
            <i class="fa fa-facebook-square"></i>
        </a>
    </div>

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script>
    var socket = io.connect('http://localhost:9000');
    socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
    });
</script>
</body>
</html>

请任何人帮助我解决这个问题。

【问题讨论】:

    标签: node.js sockets socket.io


    【解决方案1】:

    您没有在服务器上正确执行 socket.io 初始化。

    这两行代码:

    var http    = require('http').Server(app);
    var io      = require('socket.io')(http);
    

    正在创建一个新的 http 服务器并将 socket.io 附加到它,然后该新服务器永远不会启动。

    您可能想要做的是与 socket.io 共享同一个 express 服务器(这是 socket.io 通常使用的方式)。

    在您的代码中,您可以通过删除上面的这两行然后在末尾插入一行来做到这一点:

    // code you already have
    var server = app.listen(port, function () {
        var host = server.address().address;
        var port = server.address().port;
    
        console.log("app listening on " + host + " " + port);
    });
    
    // initialize socket.io to use your existing express server
    var io = require('socket.io')(server);
    

    【讨论】:

    • @Jeevan - 这回答了你的问题吗?如果是这样,那么您可以通过单击答案左侧的绿色复选标记向社区表明这一点。这也将为您在堆栈溢出时遵循正确的程序赢得一些声誉积分。
    【解决方案2】:

    您已经使用 http require('socket.io')(http); 初始化了 socket.io

    所以你必须像 http.listen(port) 这样监听端口。类似问题已回答here

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2021-09-19
      • 2022-06-14
      • 2019-06-22
      • 2019-10-14
      • 2020-03-25
      相关资源
      最近更新 更多