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

时间:2012-06-27 19:08:48

标签: javascript node.js express socket.io

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

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

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);

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

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

最后,我运行我的服务器脚本并在Web浏览器中转到该应用程序。我的静态公共文件都已正确提供,但我获得了/socket.io/socket.io.js的404。现在,我可以从另一个旧项目交换express包,让整个系统工作。不知何故,包实例配置不同,但我无法弄清楚如何重现它。 Express网站提到了有关安装依赖项的内容,尽管运行npm install -d似乎没有帮助(运行pwd时是否需要特定的npm install -d?)。我想在使用NPM安装新的Express实例后,我必须遗漏一些重要的事情。

感谢您的所有见解!

1 个答案:

答案 0 :(得分:6)

好的,所以我的例子实际上是我的代码的缩写,并且该示例代码确实有效。我遇到问题的真正代码更加混乱,如下所示:

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命令包含服务器对象的一些附加功能。我最初发布的简写示例确实有效,因为listen被链接到最终返回到服务器变量中。有趣的小细微差别。