Nodejs express4.X和socket.io遇到的问题--------新更新

Nodejs express4.X和socket.io遇到的问题--------新更新

为啥会自己主动去请求 /socket.io/下面这个路径的东西,我app.js里面肯定是没有这个路由的 一直报这个错4.png 5.png

服务端代码 1.png

客户端代码 2.png

使用的是 express4.8和socket.io


3 回复

当然可以!根据你提供的信息,你遇到了一些关于 socket.ioexpress 中自动请求 /socket.io/ 路径的问题。这通常是由于 socket.io 自动处理 WebSocket 连接而引起的。

问题描述

你提到 socket.io 会在你的应用中自动请求 /socket.io/ 路径,即使你在 app.js 中没有定义这个路由。实际上,这是 socket.io 正常工作的表现,它需要这个路径来处理 WebSocket 连接。

示例代码

服务端代码 (app.js)

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
    console.log('A user connected');
    
    socket.on('disconnect', () => {
        console.log('User disconnected');
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

客户端代码 (index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Example</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io();

        socket.on('connect', () => {
            console.log('Connected to server');
        });

        socket.on('disconnect', () => {
            console.log('Disconnected from server');
        });
    </script>
</body>
</html>

解释

  1. 服务端代码:

    • 我们创建了一个 express 应用,并使用 http 模块创建了一个 HTTP 服务器。
    • 然后我们初始化了 socket.io 实例,并将其绑定到 HTTP 服务器上。
    • 当有新的 WebSocket 连接时,io.on('connection') 事件会被触发,我们在控制台输出一条消息。
    • 同样地,当用户断开连接时,socket.on('disconnect') 事件也会被触发。
  2. 客户端代码:

    • 我们在 HTML 文件中引入了 socket.io 的客户端库。
    • 使用 io() 函数创建了一个与服务器的 WebSocket 连接。
    • 当客户端成功连接到服务器时,socket.on('connect') 事件会被触发,我们在控制台输出一条消息。
    • 当客户端断开连接时,socket.on('disconnect') 事件也会被触发。

总结

socket.io 需要通过 /socket.io/ 路径来处理 WebSocket 连接,这是正常的。如果你看到这个路径的请求,通常不需要担心。确保你的客户端代码正确引入了 socket.io 库,并且与服务端正确连接即可。


我把服务端代码放在 ./bin/www 里了,这里有声明过的server变量而不是自己去创建一个,你可以参考我之前写的一个聊天室(没写完,掩面逃(( https://github.com/klamtlne/Chatty/blob/master/bin/www

根据你的描述,问题可能是由于 socket.io 自动创建了一个与 socket.io 客户端进行通信的路径。socket.io 为了保持连接,会定期发送心跳包(ping)并接收响应(pong),这些操作都会通过 /socket.io/ 路径进行。

示例代码

服务端代码 (app.js)

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
    console.log('New client connected');
    socket.on('disconnect', () => {
        console.log('Client disconnected');
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

客户端代码 (index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Test</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io();

        socket.on('connect', () => {
            console.log('Connected to server');
        });

        socket.on('disconnect', () => {
            console.log('Disconnected from server');
        });
    </script>
</body>
</html>

解释

  1. 服务端:

    • 创建一个 Express 应用和 HTTP 服务器。
    • 使用 socketIo 实例来监听客户端的连接和断开事件。
  2. 客户端:

    • 引入 socket.io 客户端库。
    • 连接到服务器,并监听连接和断开事件。

解决方法

如果你发现 /socket.io/ 路径被自动访问导致错误,可能是因为你的客户端或服务端配置有问题。确保你正确地引入了 socket.io 库,并且服务端正确设置了 socket.io 的监听器。

如果问题依然存在,可以检查以下几点:

  1. 确保 socket.io 版本与 Express 版本兼容。
  2. 检查是否有其他中间件或路由冲突。
  3. 确保 socket.io 服务端正确地监听了 connectdisconnect 事件。

如果以上步骤仍然不能解决问题,请提供更多的错误信息或详细日志,以便进一步排查。

回到顶部