TL; DR - 如何防止客户端收到自己的消息?
根据我对apollo
和graphql
的体验,我正在使用socket.io。
我的简单服务器如下所示:
io.on('connection', (socket) => {
console.log('New connection established.');
socket.on('disconnect', () => {
console.log('User disconnected.');
});
// Projects:
socket.on('join project', (data) => {
console.log(`User (${data.user.email}) join project with ID ${data.project.id}`);
socket.join(data.project.id);
});
socket.on('leave project', (data) => {
socket.leave(data.project.id);
});
socket.on('change field', (data) => {
console.log('Field was changed:', data);
const { project } = data;
socket.to(project.id).broadcast.emit('field changed', data);
});
});
我在我的应用程序中发出了类似的内容:
socket.emit('change field', {
project: {
id: 1,
},
value: 'Hello world',
usersEmail: 'example@email.com',
fieldName: 'description',
});
socket.on('field changed', (data) => {
// if (data.usersEmail === 'example@email.com') return; // This would stop from receiving own messages
console.log('CLIENT: field was changed!', data);
});
我认为会发生(由于我在broadcast
中设置的on('change field', ...)
标记):
正在发生的事情是其他客户端和客户端A本身的日志,说该字段已更改。我错过了什么吗?
答案 0 :(得分:1)
我遇到了完全相同的问题。无法(或者没有尽力)找到它的设置,所以只需在页面加载时将其添加到我的客户端:
Connected
然后,将其添加到您在客户端中发出的消息中:
document.windowid = Math.round(Math.random() * 1000000000000);
然后,当您接受客户端上的数据时,仅在windowid不相同时执行操作:
windowid: document.windowid
这不是很好,socket.io应该处理这个问题,但这是我在我的应用程序中使用的解决方案:)