Socket.IO在某些URL上出现404错误,但在其他URL上却没有

时间:2019-08-13 01:41:58

标签: javascript node.js express socket.io

我正在尝试在我的Web应用程序中使用Socket.IO,到目前为止,它运行良好。但是,很长一段时间以来,我一直在尝试解决一个特定的问题,但找不到其他人遇到相同的问题。 Socket.IO在只是site.com/example的URL上效果很好,但是,当我在域上堆叠路径时,在socket.IO中得到404。例如,site.com / user / example为socket.IO显示404。在日志中,当需要访问site.com/socket.io时,它将尝试访问site.com/user/socket.io / ...上的socket.IO。它似乎仅在最后一个/之后替换URL,因此site.com/ex/a会使其尝试在site.come / ex / socket.io上获取socket.io。(我使用的是ExpressJS,我不知道如果相关的话。)

我尝试设置用于客户端脚本的socket.io的路径和资源。另外,在将socket.io实例绑定到http服务器时,我包括了路径。

这是我的服务器端代码。

var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server, {path: '/socket.io'});

这是我的客户端代码。

var socket = io.connect('https://example.net', {
    path: '/socket.io',
    resource: '/socket.io',
    transports: ['websocket'],
    upgrade: false
})

非常感谢您提供的所有帮助! (对于这个问题的格式有误,我感到很抱歉,这是我第一次问StackOverflow!)

1 个答案:

答案 0 :(得分:0)

您可能需要在socket.io脚本标签上加一个斜杠。

最重要的提示是,您说socket.io脚本在页面URL为https://example.net/dashboard时加载,而在https://example.net/user/fludo时不加载。并且,该屏幕截图显示了它试图从https://example.net/user/fludo/socket.io/socket.io.js加载脚本,这确实是错误的路径。

问题是您的<script>标签使用的是页面相对链接,URL上没有前导/。这意味着浏览器将页面URL的路径与<script>标记中的文件名结合在一起。但是,您不想使用页面的路径。您希望每次都从同一位置加载它。因此,为此,您需要进行以下更改:

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

对此:

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