Node.js/socket.io/socket.io.js未找到 - Express 4.0

7
我正在尝试在我的网站上实现聊天功能,当我在本地测试时,它非常好用,因为我的本地主机的8080端口是可用的。但现在我将代码推送到了我的Heroku应用程序上,当我尝试加载聊天页面时,我会收到错误提示,指出无法获取localhost:8080/socket.io/socket.io.js。
我看到了 node.js /socket.io/socket.io.js not found 并尝试了其中的建议,但都没有起作用,即使将socket.io.js文件移入资源文件夹中也不行。我猜这可能是因为我使用的是express 4.0?
任何帮助都将不胜感激。 谢谢
编辑: 为了更详细地说明问题,附上我的相关app.js代码:
 var client = require('socket.io').listen(8080).sockets;

在我的Jade文件中,聊天页面有以下内容:
 script (src = `'http://localhost:8080/socket.io/socket.io.js`')

以后

 var socket = io.connect(`'http://localhost:8080`');

所有这些都在本地主机上运行(我在端口5000上加载,socket.io连接到端口8080)。我使用heroku工具包中的“foreman start”进行操作。

当我尝试将它们更改为在heroku上运行时,它会出现故障,我不确定如何修复。希望这能澄清问题。

编辑2:我正在运行:

express 4.0.0

socket.io 0.9.16

node 0.10.x

谢谢


你能发布一下错误信息吗? - vipulsodha
2个回答

9

您是否在express中有一个明确的路由,用于捕获所有其他路由?可能是这样的:

app.get("/", handlers.home);
app.get("/..." ...);
...
app.get("*", handlers.error);

这可能会阻止 socket.io 为客户端托管自己的 js 文件。有一种简单的方法可以解决这个问题,因为你可能已经在 express 中设置了一个 publicstatic 文件夹。类似以下内容:

app.use(express.static("public"));

创建一个名为 socket.io 的新文件夹,并将相应的 socket.io.js 文件复制到该文件夹中,一切都应该没问题了。但是请注意,有两个名为 socket.io.js 的文件!!所以,如果你看到像 "Uncaught ReferenceError: require is not defined" 这样的东西,这意味着你复制了 "node-ey" 服务器端文件。这是正确的 客户端 文件,需要复制:

app_dir/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.min.js

注意 @BHendricks: 我本来会回复您的评论,但我目前还没有必要的声望。 编辑: OPs 的问题可能更多地与 "localhost" 问题有关。当从客户端连接(比如你家里的 IP)时,就像你的浏览器知道的那样 - localhost 意味着与本地托管内容的机器连接。因为你的家庭机器(或手机)没有托管 socket.io,所以连接失败了。
你需要做的是让服务器嵌入套接字连接信息(可以是完全合格的主机名、IP等)。这可以在服务器用客户端连接"渲染"页面时完成。

我将js文件复制到public文件夹中(在其中创建了socket.io目录),然后在前端使用let socket = io(“http://localhost:5000”)时出现以下错误。有人可以帮忙解决吗?GET http://localhost:5000/socket.io/?EIO=4&transport=polling&t=Nnpj-9M 404(未找到) - Ishara Kularatna

3

当您访问 http://localhost:8080/socket.io/socket.io.js 时会发生什么?

它是否返回404错误?如果是,您需要确保该文件位于Express设置为静态服务的目录中。

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

将你的socket.io.js文件放在public/socket.io/socket.io.js中(相对于你的app.js文件)。

重新启动服务器,看看是否解决了问题。

基本上,除非你明确告诉Express从哪里映射,否则它不会从文件系统静态地提供文件。


我尝试了这种方法,将我的脚本行脚本(src = 'http://localhost:8080/socket.io/socket.io.js')更改为(src = '/socket.io/socket.io.js'),现在我得到了:未捕获的引用错误:未定义 require。 - BHendricks
谢谢!这个很好用。如果你也在压缩/混淆客户端的JS等文件,这提供了一种退出的方式。非常感谢。 - arcseldon

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