Express + socket.io:socket.io客户端脚本是404

这让我疯狂了……虽然我有Express + Socket.io的工作版本,但是我似乎无法用新的项目文件夹中的现成NPM安装来重现它。 任何人都可以指出我错过了什么…? 这是我的过程:

我在我的项目目录( pwd )中创build一个node_modules文件夹,然后执行:

 npm install express npm install socket.io 

运行这两个命令,将包放入项目的node_modules文件夹中。 现在我使用以下方法设置我的服务器:

 var express = require('express'), server = express.createServer().use( express.static(__dirname+'./public') ).listen( 8080 ), io = require('socket.io').listen(server); 

我的公用文件夹包含我的应用程序的静态资产 我的公共索引HTML页面包含一个脚本标签:

 <script src="/socket.io/socket.io.js"></script> 

最后,我运行我的服务器脚本,并在Web浏览器中转到应用程序。 我的静态公共文件都得到了正确的服务,但是我得到了一个404的/socket.io/socket.io.js 。 现在,我可以从另一个旧项目中交换一个express包裹,让这个整个系统工作。 不知何故,包实例configuration不同,但我不知道如何重现。 Express网站提到了安装依赖关系的一些问题,虽然运行npm install -d似乎没有帮助(在运行npm install -d时候是否有一个特定的pwd )? 我想我必须在使用NPM进行安装之后丢失一些有关configuration新的Express实例的重要信息。

感谢任何和所有的洞察力!

好的,所以我的例子实际上是我的代码的缩写,而且这个例子代码确实有效。 我的问题真正的代码有点混乱,像这样:

 var server = express.createServer(); server .use( server.router ) .use( express.static(__dirname+'/../public') ) .get('/api', function(req, res) { res.write('API'); }); server.listen(8080); var io = require('socket.io').listen(server); 

我通过执行以下操作来修复上述代码:

 server = server.listen(8080); 

显然listen命令用一些附加function来包装服务器对象。 我最初的简短的例子实际上确实工作,因为listen被链接到服务器variables的最终返回。 有趣的小细微差别。