Nodejs 用src='&39;/socket.io/socket.io.js&39; 得到400错误

Nodejs 用src=’&39;/socket.io/socket.io.js&39; 得到400错误

这个问题似乎在网上被仿佛提到,但我查了包括stackoverflow上的许多帖子,还是无法排除400 求指点~~!!

用的是Express 3.3.4 + socket.io 0.9.16 Server端写为

app.js

… var app = express(); var server = require(‘http’).createServer(app).listen(app.get(‘port’)); var io = require(‘socket.io’).listen(server); app.set(‘port’, process.env.PORT || 3000); … app.get(’/find’, function (req, res){ finder.test(req, res,io); }) …

find.js

exports.test = function(req,res,io){

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

res.render(‘page’); }

… page.jade

… script(src=’/socket.io/socket.io.js’) script. var tokens = location.href.split(’/’); var url = tokens[0]+’//’+tokens[2]; var socket = io.connect(url); socket.on(‘news’,function(data){ console.log(data);

    socket.emit('my other event',{my:'data'});
    })

得到的客户端错误。。 GET http://localhost:3000/socket.io/socket.io.js 400 (Bad Request) Uncaught ReferenceError: io is not defined

真诚求助~~~


4 回复

针对你遇到的400错误以及io is not defined错误,我们需要确保socket.io库正确加载,并且服务器端配置正确。下面是改进后的代码示例,包括app.jsfind.jspage.jade文件。

服务器端(app.js

确保你的app.js文件正确地设置了静态资源目录,以便能够正确地提供socket.io库。

var express = require('express');
var http = require('http');
var path = require('path');
var app = express();
var server = http.createServer(app).listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});

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

app.use(express.static(path.join(__dirname, 'public')));

app.set('port', process.env.PORT || 3000);

app.get('/find', function (req, res) {
    finder.test(req, res, io);
});

// 其他路由和中间件

客户端(page.jade

确保你的Jade模板正确引用了socket.io库,并且使用正确的URL连接到服务器。

doctype html
html
    head
        title Socket.IO Test
        script(src='/socket.io/socket.io.js')
    body
        h1 Socket.IO Test
        script.
            var socket = io.connect('http://' + document.domain + ':' + location.port);
            socket.on('news', function (data) {
                console.log(data);
                socket.emit('my other event', { my: 'data' });
            });

客户端脚本(find.js

确保你的find.js文件中的逻辑没有问题。

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

    // 渲染页面
    res.render('page');
};

关键点总结

  1. 确保静态资源目录:在app.js中添加app.use(express.static(path.join(__dirname, 'public')));以确保socket.io库能够被正确提供。
  2. 正确引用路径:在page.jade中使用document.domainlocation.port来动态生成正确的WebSocket URL。
  3. 检查依赖版本:你使用的Expresssocket.io版本较旧,建议更新到最新版本以获得更好的兼容性和功能支持。

通过以上调整,你应该能够解决400错误以及io is not defined的问题。


那个官方的例子有点问题的,其实这个,socket-io只是,socket的服务器端,你要使用它的客户端https://github.com/LearnBoost/socket.io-client,然后再引用这个里面的客户端js文件(具体看支持饿什么协议,引用相应的文件)。

根据你描述的情况,出现 400 Bad Request 错误通常是由于服务器无法正确解析请求。在你的案例中,错误可能发生在尝试加载 /socket.io/socket.io.js 文件时。Socket.IO 的客户端库通常需要通过特定的方式提供,而不是通过简单的文件服务。

以下是一些可能的原因和解决方案:

  1. 确保正确安装了 Socket.IO: 确保你已经在项目中正确安装了 Socket.IO

    npm install socket.io
    
  2. 正确配置 Express 服务器以提供 Socket.IO 客户端文件: 使用 express.static 中间件来提供静态文件。这将确保 Socket.IO 的客户端文件能够被正确访问。

    var express = require('express');
    var http = require('http');
    var socketIo = require('socket.io');
    
    var app = express();
    var server = http.createServer(app).listen(3000);
    var io = socketIo.listen(server);
    
    // 配置静态文件中间件
    app.use(express.static(__dirname));
    
    app.get('/find', function (req, res) {
        finder.test(req, res, io);
    });
    
    // Socket.IO 监听连接
    io.sockets.on('connection', function (socket) {
        socket.emit('news', { hello: 'world' });
        socket.on('my other event', function (data) {
            console.log('socket.io log');
            console.log(data);
        });
    });
    
    // 导出 finder 模块
    var finder = require('./find');
    
  3. 页面中引用 Socket.IO 客户端文件: 确保在页面中正确引用了 Socket.IO 客户端文件。使用 express.static 会自动处理这些文件的提供。

    script(src='/socket.io/socket.io.js')
    script.
      var socket = io.connect('/');
      socket.on('news', function(data){
          console.log(data);
          socket.emit('my other event', { my: 'data' });
      });
    

通过上述步骤,你应该可以解决 400 Bad Request 错误,并且能够在客户端正确使用 Socket.IO。确保所有依赖项已正确安装,并且服务器配置正确。

回到顶部