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

5
这让我很疯狂...虽然我有一个工作版本的Express + Socket.io,但我似乎无法在新项目文件夹中通过 out-of-the-box 的NPM安装复制它。有人能指出我错过了什么吗?我的步骤如下:
我在我的项目目录(pwd)中创建一个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);

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

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

最终,我运行服务器脚本并在Web浏览器中打开应用程序。我的静态公共文件都被正确提供,但是/socket.io/socket.io.js返回404错误。现在,我可以从另一个旧项目中切换到一个express包并让整个系统工作。不知何故,该软件包实例被配置不同,但我无法弄清楚如何复制它。Express网站提到了安装依赖项的问题,尽管运行npm install -d似乎没有任何帮助(在运行npm install -d时是否需要特定的pwd?)。我想我肯定错过了一些重要的东西,关于在使用NPM安装后配置新的Express实例方面。感谢您提供任何见解!

1
安装的Express和Socket.io版本是什么?我刚刚按照你的步骤操作了一遍,静态资源和socket.io.js都能正常提供服务。 - Timothy Strimple
1
客户端的socket.io.js是动态生成的,它与你的express静态服务器没有任何关系。我能否获取有关失败路由的更多信息?检查一下当你访问http://localhost:8000/socket.io/socket.io.js或http://localhost:8000/socket.io/时会发生什么(将8000替换为你运行应用程序的端口号)。 - Sdedelbrock
同蒂莫西所说的一样...在我的电脑上可以运行。虽然在Windows中,我不得不将静态文件的路径更改为以下内容:__dirname+'/public'(去掉了点)。 - Hector Correa
1个回答

7

好的,我的例子实际上是对我的代码的缩写,这个示例代码确实可以工作。我真正有问题的代码比较混乱,像这样:

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 链接到最终返回到服务器变量中。有趣的小细节。


很高兴能帮忙!这确实是一个奇怪的问题,我仍然有点困惑。有人知道 .listen() 函数实际返回什么吗?我会认为它返回对其调用的 http.Server 对象的引用(以便进行链接)。它返回的对象似乎具有一些类似于 http.Server 对象的方法,但并不完全相同。不幸的是,文档没有指定返回值的性质。 - bigmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接