node.js - 如何使用 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!");
}
});
感谢您的每一次帮助。
解决方案
这对我有用。
服务器:
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);
})
推荐阅读
- c# - 如何在 UWP 中滚动到文本框的末尾?
- javascript - 使用 three.js 的 3D 图
- tvos - 如何使用 Xamarin 从 tvOS 应用程序调用获取 REST API?
- html - bootstrap sm 调整大小不刹车
- android - 如何使用 Gradle 6.1.1 为 APK 设置压缩?
- angular - 模块结构Angular,是否在模块中使用共享组件?
- asp.net-core - 如何使用证书保护 .Net Core 应用程序以进行试用
- reactjs - 在 Next.js 中更改 Ant Design 的主题颜色
- laravel - 实现 ShouldQueue 时,Laravel 通知“无法使用字符串键解压数组”
- python-3.x - 负数除法和取模