在上一篇文章中,我们介绍了如何通过socket.io和Node.js实现一个简单的多人聊天室,本篇将进一步升级我们的聊天室,增加用户登录、注册、聊天记录存储等功能。
前置知识
- 基本的socket.io和Node.js知识
- MySQL数据库基本操作
功能实现
用户登录和注册
在我们的聊天室中,首先需要判断用户是否已经登录,如果没有,则需要进行用户注册或者登录。
我们可以通过在客户端发送登录/注册请求,服务器接受请求后将数据存储到MySQL数据库中的方式来实现这个功能。
客户端代码:
// javascriptcn.com 代码示例 // 注册 socket.emit('register', { username: username, password: password }); // 登录 socket.emit('login', { username: username, password: password });
服务端代码:
// javascriptcn.com 代码示例 io.on('connection', function(socket) { // 注册 socket.on('register', function(data) { var username = data.username; var password = data.password; // 判断用户是否存在 var sql = `SELECT * FROM users WHERE username = '${username}'`; connection.query(sql, function(err, rows, fields){ if (err) { throw err; } if (rows.length > 0) { // 用户已存在 socket.emit('register-fail', { msg: '用户已存在!' }); } else { // 插入数据库 sql = `INSERT INTO users(username, password) VALUES('${username}', '${password}')`; connection.query(sql, function(err){ if (err) { throw err; } socket.emit('register-success', { msg: '注册成功!' }); }); } }); }); // 登录 socket.on('login', function(data) { var username = data.username; var password = data.password; // 从数据库中查询该用户 var sql = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`; connection.query(sql, function(err, rows, fields){ if (err) { throw err; } if (rows.length > 0) { // 登录成功 socket.emit('login-success', { msg: '登录成功!' }); socket.username = username; // 将用户名存入socket中 } else { // 登录失败 socket.emit('login-fail', { msg: '用户名或密码错误!' }); } }); }); });
消息记录存储
我们的聊天室需要支持历史消息查看功能,因此需要将聊天记录存入MySQL数据库中,下面是实现代码:
// javascriptcn.com 代码示例 io.on('connection', function(socket) { // 用户登录状态 if (socket.username) { // 如果用户已登录 // 查询历史记录 var sql = `SELECT username, message, time FROM messages WHERE username = '${socket.username}' ORDER BY id LIMIT 50`; connection.query(sql, function(err, rows, fields){ if (err) { throw err; } // 向客户端发送历史消息 for (var i = 0; i < rows.length; i++) { socket.emit('message', { username: rows[i].username, message: rows[i].message, time: rows[i].time }); } }); } // 收到消息 socket.on('message', function(data) { var username = data.username; var message = data.message; var time = new Date().getTime(); // 将聊天记录存入数据库 var sql = `INSERT INTO messages(username, message, time) VALUES('${username}', '${message}', ${time})`; connection.query(sql, function(err){ if (err) { throw err; } // 向所有客户端发送消息 io.sockets.emit('message', { username: username, message: message, time: time }); }); }); });
在这段代码中,我们使用了socket.io提供的socket.emit()
方法和io.sockets.emit()
方法向客户端或者所有客户端广播消息。
总结
通过将注册、登录、聊天记录存储等功能加入到我们的聊天室中,我们实现了一个更加完善的多人聊天室。
在这个过程中,我们学习了如何使用Node.js连接MySQL数据库,如何通过socket.io实现客户端与服务端双向通信,以及如何通过socket.io实现多人聊天室。
这些知识点在实际开发中都十分重要,希望能对您有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f075e7d4982a6eb880645