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
真诚求助~~~
针对你遇到的400错误以及io is not defined
错误,我们需要确保socket.io
库正确加载,并且服务器端配置正确。下面是改进后的代码示例,包括app.js
、find.js
和page.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');
};
关键点总结
- 确保静态资源目录:在
app.js
中添加app.use(express.static(path.join(__dirname, 'public')));
以确保socket.io
库能够被正确提供。 - 正确引用路径:在
page.jade
中使用document.domain
和location.port
来动态生成正确的WebSocket URL。 - 检查依赖版本:你使用的
Express
和socket.io
版本较旧,建议更新到最新版本以获得更好的兼容性和功能支持。
通过以上调整,你应该能够解决400错误以及io is not defined
的问题。
根据你描述的情况,出现 400 Bad Request
错误通常是由于服务器无法正确解析请求。在你的案例中,错误可能发生在尝试加载 /socket.io/socket.io.js
文件时。Socket.IO 的客户端库通常需要通过特定的方式提供,而不是通过简单的文件服务。
以下是一些可能的原因和解决方案:
-
确保正确安装了 Socket.IO: 确保你已经在项目中正确安装了 Socket.IO:
npm install socket.io
-
正确配置 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');
-
页面中引用 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。确保所有依赖项已正确安装,并且服务器配置正确。