【问题标题】:How to prevent socket.io executing an event for all users?如何防止 socket.io 为所有用户执行事件?
【发布时间】:2021-04-22 06:42:16
【问题描述】:

每当我按下客户端上的按钮向服务器发送发出请求时,该按钮都会为所有连接的用户执行。我想让它只向当前用户发出。有什么办法可以做到吗?

client.js

handleForm = () => {
        socket.emit("request-uid");
        socket.on("uid", (uid) => {
            socket.emit("validate-data", {
                title: this.state.title,
                price: this.state.price,
                email: this.state.email,
                description: this.state.description,
                contact: this.state.contact,
                tags: this.state.tags,
            });
        });
    };
socket.on("refresh", () =>{
    alert("test!");
});

server.js

io.on("connection", function (socket) {
    console.log("user connected!");
    socket.on("request-uid", () => {
        io.emit("uid", crypto.randomBytes(4).toString("hex"));
    });

    socket.on("validate-data", (data) => {
            io.to(socket.id).emit("refresh");
        
    });
});

当我单击执行handleForm() 函数的按钮时,它会向当前在站点上的每个用户发出套接字,无论他们是否按下该按钮。

即使我在服务器端使用io.to(socket.id),它也会将它发送给每个人,我猜这是因为“验证数据”正在运行,它会发送一个唯一的套接字来发送给所有用户。

我只是希望它向按下按钮的用户发送请求。

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    io.emit('uid')uid 事件发送到所有客户端套接字,然后在回调中每个客户端将自己的validate-data 发送到服务器。将io.emit('uid')改为socket.emit('uid'),也可以将io.to(socket.id).emit('refresh')简化为socket.emit('refresh')

    【讨论】:

    • 遗憾的是这似乎不起作用,有没有办法改变 socket.emit("validate-data") 使其仅从那个用户发出?
    • @Pylot socket.emit('validate-data') 是客户端。问题是每次任何客户端发出request-uid 时,io.emit('uid') 都会向所有客户端发出一个唯一的 id,然后所有客户端都以validate-data 响应。
    • @Pylot 在进行建议的更改后,您是否确保重新启动服务器并刷新所有客户端?
    • 哦!我明白你的意思了!你绝对正确,更改 UID 修复它!非常感谢,这似乎已经解决了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多