首页 > 解决方案 > 如何使用 nodejs 和 socket.io 在聊天室中验证密码功能

问题描述

我正在尝试验证聊天室的密码,但是当第二个用户进入时,这让我很复杂。第一个用户应该定义密码,但是当第二个用户输入时,我无法保留第一个密码。

我在服务器端有这个:

//Run when client connects
io.on("connection", (socket) => {
socket.on("joinRoom", ({ username, room, password }) => {
const user = userJoin(socket.id, username, room, password);
socket.join(room);
socket.join();
});

在客户端:

//Join Chatroom
socket.emit("joinRoom", { username, room, password });

我已经完成了这个功能,但它不像我之前所说的那样工作:

服务器端:

socket.on("checkPassword", ({ username, room, password}) => {
  const user = userJoin(socket.id, username, room);
       if (password1 == password) {
         io.sockets.emit("passwordFeedback", "correct");
       }else{
         io.sockets.emit("passwordFeedback", "wrong");
       }
})

password1它应该是第一个用户插入的密码。 password它应该是第二个用户插入的密码。如果我存储第一个密码(应该存储然后与第二个用户输入的密码进行比较),它会失败,只存储当前用户连接。

客户端:

//Join private room
  socket.emit("checkPassword", { username, room, password });
  socket.on("passwordFeedback", function (flag) {
    if (flag == "correct") {
      console.log('password match')
    }else{
      console.log('password didnt match')
      alert("Incorrect Password!");
    }
  });

感谢您的每一次帮助。

标签: node.jssocket.io

解决方案


这对我有用。

服务器:

let rooms = {}
io.of('/test').on('connection', (socket) => {
    console.log('Connected', socket.id);

    socket.on("joinRoom", ({ username, room, password }) => {
        let isEntryAvailable = userJoin(socket.id, username, room, password);
        if (isEntryAvailable) {
            socket.emit('passwordFeedback', 'correct')
        } else {
            socket.emit('passwordFeedback', 'wrong')
        }
    })
    
    socket.on('disconnect', () => {
        io.of('/test').emit('message', 'user disconnected '+ socket.id);
        if (rooms[rooms[socket.id]] && Object.keys(rooms[rooms[socket.id]]).length == 2) {
            delete rooms[rooms[socket.id]];
        } else {
            if (rooms[rooms[socket.id]] && rooms[rooms[socket.id]][socket.id]) {
                delete rooms[rooms[socket.id]][socket.id];
            }
        }
        delete rooms[socket.id];
        console.log('Disonnected', socket.id);
        console.log(rooms);
    })

    function userJoin (socketId, username, room, password) {
        if (!rooms[room] || (rooms[room] && !rooms[room].password)) {
            if (!rooms[room]) {
                rooms[room] = {};
            }
            rooms[room].password = password;
            rooms[room][socketId] = username;
            rooms[socketId] = room;
            return true;
        } else {
            if (rooms[room].password == password) {
                rooms[socketId] = room;
                rooms[room][socketId] = username;
                socket.join(room);
                return true;
            } else {
                return false;
            }
        }
    }
})

客户:

const socket = io('http://localhost:3000/test');

socket.on('connect', () => {
    console.log('Connected', socket.id);
    socket.emit('joinRoom', { room: 'room0', username: 'name1', password: 'pass@1234' });
})

socket.on('passwordFeedback', (data) => {
    console.log(data);
})

推荐阅读