我正在尝试使用socket.io和express进行示例客户端连接(具体来说,这一个:http://www.catonmat.net/blog/nodejs-modules-socketio/包含来自https://github.com/LearnBoost/socket.io/blob/master/examples/chat/app.js的其他示例中的一些部分)。
我已经完成了大部分设置和工作 - 服务器运行,我可以点击/获取index.jade文件到浏览器。但是,一旦发生这种情况,它什么都不做。
服务器:
var io = require('socket.io');
var express = require('express')
, stylus = require('stylus')
, nib = require('nib');
var app = express.createServer()
var io = io.listen(app);
app.configure(function () {
app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }));
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname);
app.set('view engine', 'jade');
function compile (str, path) {
return stylus(str)
.set('filename', path)
.use(nib());
};
});
app.get('/', function (req, res) {
res.render('index', { layout: false });
});
app.listen(8080);
io.sockets.on('connection', function (socket) {
console.log('A socket connected!');
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
socket.on('disconnect', function () {
console.log('user disconnected');
});
});
index.jade:
doctype 5
html
head
link(href='/stylesheets/style.css', rel='stylesheet')
script(src='http://code.jquery.com/jquery-1.6.1.min.js')
script(src='/socket.io/socket.io.js')
script
// socket.io specific code
var socket = io.connect('http://localhost:8080');
socket.on('connect', function () {
alert('connected');
});
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
body
#chat
服务器似乎没有服务于/socket.io/socket.io.js(http:// localhost:8080 / socket.io / socket.io.js产生错误)。我需要做什么来快递才能提供该文件?我在任何一个例子中都找不到。
还有什么我在这里做错了吗?
答案 0 :(得分:9)
Using Socket.IO要求您实例化http.Server
以将socket.io附加到:
var express = require('express')
, http = require('http')
, app = express()
, server = http.createServer(app).listen(3000)
, io = require('socket.io').listen(server)
;
这应该适合你。
答案 1 :(得分:2)
使用带有socket.io的Express 3的一些升级指南建议将http.createServer传递给socket.io。
这有效,但它似乎没有正确地提供socket.io客户端文件。 通过一些测试,我发现如果你将从app.listen返回的内容传递给socket.io:
var express = require('express'),
app = express(),
server = app.listen(3000),
io = require('socket.io').listen(server);
请注意一些回复的人:这不是文件路径问题。使用node + socket.io时,http服务器socket.io会自动拦截对'/ socket.io/socket.io.js'的get调用,并为您提供客户端文件。它实际上并不存在于Web文件结构中。使用Express 3时,此功能似乎已损坏。
答案 2 :(得分:0)
我假设错误是404 - 您没有设置ExpressJS来提供静态文件。当您请求/socket.io/socket.io.js
时,它没有找到路由,也没有提供静态文件,因此返回404。
通常,您需要设置一个用于提供静态文件的文件夹,例如public
。在其中,放置socket.io
文件夹,并放在socket.io.js
文件中。然后,您将其添加到app.configure
块:
app.use(express.static(__dirname + '/public'));
现在,ExpressJS知道在发出请求时提供JS文件。您可以阅读有关ExpressJS静态配置here的更多信息。
<强>更新强>
我的错误 - 我看到你已经设置了静态服务器。您的目录路径是否正确? socket.io
文件夹中的public
文件夹是?没有看到您的具体错误,很难知道问题可能是什么。