Node.js Socket.io断开与组件的连接不工作将卸载

Node.js Socket.io断开与组件的连接不工作将卸载,node.js,reactjs,sockets,Node.js,Reactjs,Sockets,我正在尝试使用socket.io创建实时聊天。但是,我无法断开聊天应用程序的连接 前端 constructor(props){ super(props); this.state={ endpoint: 'localhost:3001' } this.socket = socketIOClient(this.state.endpoint); } componentDidMount

我正在尝试使用socket.io创建实时聊天。但是,我无法断开聊天应用程序的连接

前端

constructor(props){
        super(props);
            this.state={
                endpoint: 'localhost:3001'
        }
        this.socket = socketIOClient(this.state.endpoint);
    }
    componentDidMount() {
        this.socket.emit('join', {name: "name",room: "rooms" }, () => {

        });
    }
    componentWillUnmount(){
        this.socket.emit('disconnect');
        this.socket.off();
    }
服务器端

var app = express();
let server = app.listen(PORT, ()=> console.log('Listening on port ' + PORT));
let io = require('socket.io')(server);

io.on('connection', (socket) => {
    console.log('We have a new conneciton');

    socket.on('join', ({name, room}, callback) => {
        console.log(name, room);

    })

    socket.on('disconnect', () => {
        console.log('user had left');
    })
})
卸载组件时,控制台中不会弹出用户离开的窗口

我哪里出错了


我还注意到,套接字“join”和“disconnect”将始终运行,即使我没有从客户端调用。为什么会这样?

您应该使用
socket.disconnect()
来断开与套接字的连接

off()不会阻止此客户端套接字接收任何服务器发送的消息,它只是防止触发指定的事件处理程序。通常情况下,这是我们想要的

join/disconnect
是套接字中的默认事件,
join
事件将在客户端连接到套接字时始终触发,
disconnect
事件将在客户端断开连接时始终触发。这就是为什么您在日志中看到这些事件,即使您没有显式调用这些事件,这些事件也会自动调用

请尝试以下代码以断开与套接字连接的连接

constructor(props){
    super(props);
    this.state = {
        endpoint: 'localhost:3001'
    }
    this.socket = socketIOClient(this.state.endpoint);
}
componentDidMount() {
    this.socket.emit('join', { name: "name", room: "rooms" }, () => {
    });
}
componentWillUnmount(){
    this.socket.emit('disconnect');
    socket.disconnect();
}

啊,明白了!谢谢你,先生