gpt4 book ai didi

javascript - 使用 Socket.io 更新用户状态失败

转载 作者:行者123 更新时间:2023-11-30 06:10:05 24 4
gpt4 key购买 nike

我一整天都在尝试完成一项通常非常简单的任务,但失败了。我尝试做的是通过 socket.io 更新聊天应用程序中的“在线状态”。

我实际上有一个在用户登录或注销时应用的通用方法,从这个通用方法我调用了一个 socket.emit(updateuser, true/false) 取决于用户是否登录in 或 off,目的是服务器通知所有其他客户端相应地更新他们的 View 。

调用 socket.emit 的方法如下所示。

setUserStatus(status: boolean): void {
const data = {
status: status
};
this.http.put<{email: any}>('http://localhost:3000/api/user/changeStatus/' + this._userMail, data)
.subscribe(response => {
this.socket.emit('changeStatus', { // Here the logic for informing the clients is called
email: response.email,
status: status
});
});

我知道发出 REST 请求并发出 socket.io 调用没有意义,但这是另一个话题 :D

在服务器端,服务器通知命名空间中的所有其他客户端相应地更新在线状态

io.of('/chat').on('connection', (socket) = > {
console.log('Chat Socket connected on server');
socket.on('new-message', (message) = > {
io.of('/chat').emit("ChatMessage", message);
});
// THIS IS THE METHOD I AM TALKING ABOUT - CHANGE STATUS!
socket.on('changeStatus', status = > {
console.log('CHANGE STATUS EMIT: UPDATE STATUS ON SERVER FOR ' + status.email);
io.of('/chat').emit('userLogged', {
email: status.email,
status: status.status
});
});

然后,一旦订阅被“调用”,我就会在我的 userList 组件(Angular)的 ngOnInit 中更新用户状态

this.logEventSub = this.chatService.newUser.subscribe(user = > {
console.log('REASSIGNING STATUS for user ' + user.email);
this.users.find(eachUser = > eachUser.email === user.email).status = user.status;
});

问题是,似乎只有发出请求的客户端才真正更新了自己的状态。其他客户端不会从服务器端获取请求。我真的不知道为什么,因为据我所知,命令 io.of.emit.... 是通知所有连接的客户端的正确命令 - 实际上,我还尝试了一些其他命令,但没有帮助。

更奇怪的是,它似乎工作了一两次 - 但我不知道实际上有什么不同 - 在控制台中,我看到客户端在他自己登录时收到了第一个请求,然后是第二个客户端登录时的第二个。第二次尝试再次失败,我无法重现。

任何帮助将不胜感激!

最佳答案

我认为您使用的是 namespace 而不是房间。如果没有看到 .on('connection') 函数,我无法确定。您应该使用房间并向整个房间广播。

您确定所有客户端套接字 this.socket 都通过 this.socket = io('/chat'); 连接到命名空间吗?

socket.to('chat').emit('hello'); 将向该房间中的每个人发送消息,除了套接字所有者(在本例中加入的人)。参见 https://socket.io/docs/server-api/#socket-to-room .

我需要看更多才能确定。

关于javascript - 使用 Socket.io 更新用户状态失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59439834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com