增加ack确认消息机制

This commit is contained in:
2026-09-23 15:45:27 +08:00
parent aedd5d1f3f
commit 74ed1535ed
+81 -3
View File
@@ -1,5 +1,6 @@
const WebSocket = require("ws"); const WebSocket = require("ws");
const url = require("url"); const url = require("url");
const db = require("../db/mysql");
const { verifyToken } = require("../utils/jwt"); const { verifyToken } = require("../utils/jwt");
@@ -77,6 +78,9 @@ function handleMessage(username, data) {
case "sendMessage": case "sendMessage":
handleSendMessage(username, data); handleSendMessage(username, data);
break; break;
case "ack":
handleAck(data);
break;
default: default:
console.log("未知消息类型:", data.type); console.log("未知消息类型:", data.type);
@@ -85,14 +89,55 @@ function handleMessage(username, data) {
// 处理发送消息 // 处理发送消息
function handleSendMessage(senderName, data) { function handleSendMessage(senderName, data) {
const messageId = data.messageId;
const receiverName = data.receiverName; const receiverName = data.receiverName;
const content = data.content; const content = data.content;
const createdAt = data.createdAt;
console.log( console.log(
`${senderName} → ${receiverName}:${content}` `${senderName} → ${receiverName}:${content}`
); );
const sql = `
INSERT INTO messages
(message_id, sender_name, receiver_name, content)
VALUES (?, ?, ?, ?)
`;
db.query(sql, [
messageId,
senderName,
receiverName,
content
], (error, result) => {
if (error) {
console.error(error);
const senderWs = getConnection(senderName);
if (senderWs) {
senderWs.send(
JSON.stringify({
type: "sendError",
messageId: messageId,
message: "消息保存失败"
})
);
}
return;
}
});
// 告诉发送者:服务器已经保存成功
const senderWs = getConnection(senderName);
if (senderWs) {
senderWs.send(
JSON.stringify({
type: "sendSuccess",
messageId: messageId
})
);
}
// 找到接收者的WebSocket // 找到接收者的WebSocket
const receiverWs = getConnection(receiverName); const receiverWs = getConnection(receiverName);
if (!receiverWs) { if (!receiverWs) {
@@ -105,13 +150,46 @@ function handleSendMessage(senderName, data) {
JSON.stringify({ JSON.stringify({
type: "newMessage", type: "newMessage",
message: { message: {
messageId,
senderName, senderName,
receiverName, receiverName,
content, content
createdAt
}, },
}) })
); );
} }
function handleAck(receiverName, data) {
const messageId = data.messageId;
const senderName = data.senderName;
console.log(
`${receiverName} 收到消息 ${messageId},发送 ACK`
);
// 找到原发送者
const senderWs = getConnection(senderName);
if (!senderWs) {
console.log(
`${senderName} 当前不在线`
);
return;
}
// 把 ACK 转给原发送者
senderWs.send(
JSON.stringify({
type: "ack",
messageId:
messageId
})
);
console.log(
`ACK ${messageId} 已发送给 ${senderName}`
);
}
module.exports = initWebSocket; module.exports = initWebSocket;