2012-04-17 60 views
11

我对socket.io示例有问题。我的浏览器无法获取socket.io.js文件(控制台中出现404错误)。浏览器无法使用快递获取socket.io.js文件


该工作代码:

server.js

var app = require('express').createServer() 
    , io = require('socket.io').listen(81); 

app.listen(80); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

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

的index.html

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


但是这一次没有:

server.js

var app = require('express').createServer() 
    , io = require('socket.io').listen(app); 

app.listen(80); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

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

的index.html

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

在这种情况下,我的浏览器不能得到socket.io.js文件。

回答

7

编辑:下面的所有文字都是错误的,直到下一个“编辑”。离开它作为有一丝...

有一件事你应该知道,两件事情你应该做的一切+需要Express doc is here

  1. 快速过滤器/天天看访问您的节点服务器。这意味着,当你试图访问你的socket.io脚本文件时,Express试图在你声明的路由中找到它,并且因为你没有(并且你是对的)而失败。
  2. 最重要的是:声明静态,非“计算”文件夹中 表达,你会把所有的静态文件(CSS,客户端脚本,图像):

    app.use('/static', express.static(__dirname + '/static'));

    此行一定要放在你app.configure打电话之前,app.use(app.router)(我居然先把它)

    我喜欢这个/ static/scripts;/static/css; /静态/ img文件夹组织,但你可以自由地适应你的需求。

  3. 更改链接socket.io脚本文件的相对路径 (可选,但强烈建议):src='/static/scripts/socket.io/socket.io.js'

编辑:我错了,非常非常错误的,我很抱歉为了那个原因。 Socket.io生成所需的不同路径/文件,您不必声明它们,也不需要复制任何客户端脚本文件。

请尝试将<script src="http://192.168.1.104:81/socket.io/socket.io.js"></script>客户端行切换到相对正常的<script src="/socket.io/socket.io.js"></script>,因为这是您的代码和快速指南代码之间的唯一区别。

+0

好了,现在的浏览器可以得到socket.io.js,但有是下一个错误,行“var client = require('socket.io-client');”在socket.io.js中:未捕获的ReferenceError:require未定义。 – 2012-04-17 08:54:23

+1

我错了,很抱歉有误导性。我更新了我的答案。 – 2012-04-17 09:19:04

+0

当我将

6

什么快递版本您使用的是?

的API已经从快递2.X改变到3.x,所以答案是Socket.IO兼容性部分在Migrating from 2.x to 3.x维基:

Socket.IO的.listen()方法采用http.Server实例作为论据。
从3.x起,express()的返回值不是http.Server实例。若要Socket.IO与快递3.X工作,请确保您手动创建和你http.Server实例传递给Socket.IO的.listen()方法:

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

server.listen(3000);