diff --git a/websocket/index.js b/websocket/index.js index 09e0ac0..8816034 100644 --- a/websocket/index.js +++ b/websocket/index.js @@ -129,21 +129,21 @@ function handleSendMessage(data, ws) { `${senderName} → ${receiverName}:${content}` ); - const sql = ` + const insertSql = ` INSERT INTO messages (message_id, sender_name, receiver_name, content) VALUES (?, ?, ?, ?) `; - db.query(sql, [ + db.query(insertSql, [ messageId, senderName, receiverName, content ], (error, result) => { + const senderWs = getConnection(senderName); if (error) { console.error(error); - const senderWs = getConnection(senderName); if (senderWs) { senderWs.send( JSON.stringify({ @@ -156,34 +156,79 @@ function handleSendMessage(data, ws) { return; } - // 数据库确认写入后,才确认发送并推送给接收者 - const senderWs = getConnection(senderName); - if (senderWs) { - senderWs.send( + // 插入新消息之后,用messageID查询这条新消息的时间点(为了使用数据库插入时创建的时间点,不能用前端自己生成的) + const timeSql = ` + SELECT created_at + FROM messages + WHERE message_id = ? + `; + db.query(timeSql, [messageId], (error, results) => { + if (error) { + console.error("查询消息失败:", error); + + if (senderWs) { + senderWs.send( + JSON.stringify({ + type: "sendError", + messageId: messageId, + message: "获取消息失败" + }) + ); + } + return; + } + + if (results.length === 0) { + if (senderWs) { + senderWs.send( + JSON.stringify({ + type: "sendError", + messageId: messageId, + message: "获取消息失败" + }) + ); + } + return; + } + + const createdAt = results[0].created_at; + + // 数据库确认写入后,才把成功写入的消息推送给发送者 + if (senderWs) { + senderWs.send( + JSON.stringify({ + type: "sendSuccess", + message: { + messageId, + senderName, + receiverName, + content, + createdAt + } + }) + ); + } + + // 把写入的新消息推送给接收者,如果接收者不在线,就不用发送websocket消息给他了,但数据库里是有的 + const receiverWs = getConnection(receiverName); + if (!receiverWs) { + console.log(`${receiverName} 当前不在线`); + return; + } + + receiverWs.send( JSON.stringify({ - type: "sendSuccess", - messageId: messageId + type: "newMessage", + message: { + messageId, + senderName, + receiverName, + content, + createdAt + }, }) ); - } - - const receiverWs = getConnection(receiverName); - if (!receiverWs) { - console.log(`${receiverName} 当前不在线`); - return; - } - - receiverWs.send( - JSON.stringify({ - type: "newMessage", - message: { - messageId, - senderName, - receiverName, - content - }, - }) - ); + }); }); }