【问题标题】:Socket.IO can't connect to server when running Express运行 Express 时 Socket.IO 无法连接到服务器
【发布时间】:2014-08-10 02:34:24
【问题描述】:

我正在尝试使用 Node.js、Express.js 和 Socket.IO 编写一个小应用程序。

服务器运行良好,我可以提供 HTML 和其他静态内容。但是我让客户端通过 Socket.IO 连接到服务器时遇到了麻烦。

当我不使用 Express 时,它可以正常工作,但使用 Express 时,我似乎无法让一切都合作。我不确定在结合使用 Express 和 Socket.IO 时是否有一些特殊的注意事项。

我的一部分认为这可能是路线问题?

看起来当套接字尝试连接时它是 404'ing:

GET http://localhost:3000/socket.io/1/?t=1403186531515 400 Bad Request 1ms

服务器代码:

var express = require('express')
  , app = express()
  , http = require('http')
  , server = http.createServer(app).listen(3000)
  , io = require('socket.io').listen(server)
  , favicon = require('static-favicon')
  , logger = require('morgan')
  , cookieParser = require('cookie-parser')
  , session = require('express-session')
  , routes = require('./routes/index')
  , path = require('path')
  , bodyParser = require('body-parser');

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(session({secret: 'keyboard cat'}));
app.use(require('less-middleware')(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

io.sockets.on('connection', function (socket) {
    //message new connection
    socket.emit('message', { message: 'Message from server.' });
    //message all connections
    socket.on('send', function (data) {
        io.sockets.emit('message', data);
    });

});

客户端代码:

** html and other js omitted **

<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script>  
<script>
    var socket = io.connect('http://localhost:3000');
</script>

我也试过了

var socket = io.connect('ws://localhost:3000');

无济于事。

感谢您的帮助!

【问题讨论】:

  • ^我第一次听说它,我检查一下。谢谢。
  • Express.io 已经过时,不再更新。
  • 有类似的替代品吗?
  • 你能在哪里解决这个问题?我现在也遇到了同样的问题
  • 我无法解决它,但我已经有一段时间没有再尝试过了,所以我将在这里重新审视一些答案。

标签: node.js express socket.io http-status-code-404


【解决方案1】:

不知道为什么在客户端使用 CDN,但可以使用本地资源(由 socket.io 在后台提供)

所以将你的脚本标签替换为:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect(); // or just io();
</script>

您可以在 Socket.io Get Started simple chat example获得更多帮助

【讨论】:

【解决方案2】:

尝试交换将服务器绑定到端口的顺序:

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

server.listen(3000);

感谢 Doug Wilson 的 his comment on GitHub,它帮助我解决了这个问题。

【讨论】:

    【解决方案3】:

    试试吧:

    var socket = io.connect();
    

    【讨论】:

    • 没有改变任何东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2021-05-24
    • 2023-03-19
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多