【React】在React使用socket.io-client出现连接失败的情况

使用场景

当我们需要实时通信的时候,我们就可以使用到到WebSocket,不过我们已经有了npm生态链,可以直接安装socket.io-client这个模块,对应的服务端使用socket.io模块。 下载安装:

// 前端
npm install socket.io-client
// 或
yarn add socket.io-client

// 后台
npm install socket.io

我们在开发项目的时候,可能会用到跨域功能,相应地配置了setupProxy.js

const {
          
    createProxyMiddleware } = require(http-proxy-middleware);

module.exports = app => {
          
   
    app.use(/api, createProxyMiddleware({
          
   
        target: http://localhost:9999,
        changeOrigin: true,
        ws: false
    }));
    app.use(/socket.io, createProxyMiddleware({
          
   
        target: ws://localhost:3004,
        changeOrigin: true,
        ws: true
    }));
};

那我们在配置socket的时候是否还需要传入目标网址呢? 亲测是需要的,另外我们最好在开启一个IO服务,用来监听socket消息,这样不会受到业务端口9999的影响。

const io = require(socket.io-client);
const socket = io(http://localhost:3004);
const app = express()
    , server = require(http).createServer(app)
    , io = require(socket.io)(server);
io.listen(3004);

module.exports = io;

代码实现

前端:

import store from @store;
import {
          
    setSocketID } from @store/actionCreators;
const Singleton = (function () {
          
   
    let instance;
    function createInstance() {
          
   
        const io = require(socket.io-client);
        const socket = io(http://localhost:3004);
        return socket;
    }

    return {
          
   
        getInstance: function () {
          
   
            if (!instance) {
          
   
                instance = createInstance().connect();
                // 创建socket就更新数据
                instance.on(connect, async () => {
          
   
                    // 更新数据库status中的socket.id
                    store.dispatch(setSocketID(instance.id));
                    await updateUS(instance.id);
                });
            }
            return instance;
        },
        disconnectSocket: ()=>{
          
   
            console.log(disconnect, instance)
            if (instance) {
          
   
                instance.disconnect();
            }
            instance = null;
            return instance;
        }
    };
})();

async function updateUS(socketID) {
          
   
    // ...
}
export default Singleton;

后端:

const app = express()
    , server = require(http).createServer(app)
    , io = require(socket.io)(server);
io.listen(3004);

// socket
io.on(connection, function (socket) {
          
   
    console.log(连接成功)
    socket.on(newMessage, async (params) => {
          
   
    	// 。。。
        }
    });
});

module.exports = io;
经验分享 程序员 微信小程序 职场和发展