浏览器无法使用express来获取socket.io.js文件

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

代码工作:

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文件。

编辑 :所有下面的文本是错误的,直到下一个“编辑”。 留下它作为一个痕迹…

有一件事你应该知道,你应该做的两件事情+所有需要快速文档在这里 :

  1. 快速filter/处理对节点服务器的每次访问。 这意味着,当你试图访问你的socket.io脚本文件时,Express试图在你声明的路由中find它,并且失败,因为你没有(而且你没有做到)。
  2. 最重要的是:声明一个静态,非“计算”文件夹,你将把所有的静态文件(CSS,客户端脚本,图像):

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

    这行必须放在你的app.configure调用之前, app.use(app.router) (我居然先把它)

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

  3. 将链接改为socket.io脚本文件为相对path(可选但强烈build议): src='/static/scripts/socket.io/socket.io.js'

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

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

你使用什么Express版本

API已经从Express 2.x更改为3.x,所以答案在从2.x迁移到3.x wiki的Socket.IO兼容性部分:

Socket.IO的.listen()方法将http.Server实例作为参数。
从3.x开始express()的返回值不是http.Server实例。 要使Socket.IO与Express 3.x一起工作,请确保手动创build并将http.Server实例传递给Socket.IO的.listen()方法:

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