CivetWeb+C+++SQLite本地网页聊天:消息发送成功但页面不显示的问题求助
CivetWeb+C+++SQLite本地网页聊天:消息发送成功但页面不显示的问题求助
我正在开发一个本地网页聊天功能,技术栈是CivetWeb(C++后端)+SQLite+纯HTML/JS前端。目前遇到一个棘手的问题:发送消息时服务器日志能正确输出Attempting to send message: product_id=3, sender=1, receiver=Admin, message=1,说明/send_message接口触发正常,而且我确认消息已经成功插入到SQLite数据库里了,但聊天页面(message_feature.html)就是不显示新消息。我已经确保发送消息后会调用loadConversation()刷新聊天记录,但聊天框里还是没动静,麻烦各位大佬帮我找找问题!
前端核心代码(message_feature.html)
async function loadConversation() { const res = await fetch(`/api/conversation?product_id=${productId}`); if (!res.ok) return; const msgs = await res.json(); const box = document.getElementById('messages'); box.innerHTML = ''; // 按时间排序消息 msgs.sort((a, b) => new Date(a.created_at) - new Date(b.created_at)); msgs.forEach(m => { const div = document.createElement('div'); div.className = 'msg ' + (m.sender === 'Admin' ? 'received' : 'sent'); div.innerHTML = `<div>${m.message}</div>`; box.appendChild(div); }); } // 消息发送表单提交逻辑 document.getElementById('chatForm').addEventListener('submit', async e => { e.preventDefault(); const fd = new FormData(e.target); const userRes = await fetch('/api/get_current_user'); const { username } = await userRes.json(); fd.append('sender', username); const body = new URLSearchParams(fd); // 发送请求到后端 const res = await fetch('/send_message', { method: 'POST', body: body }); // 发送成功后刷新聊天记录 if (res.ok) { await loadConversation(); } });
后端核心代码(C++ + CivetWeb)
// POST /send_message 消息发送接口 mg_set_request_handler(ctx, "/send_message", [](mg_connection *conn, void *) -> int { if (strcmp(mg_get_request_info(conn)->request_method, "POST") != 0) return 405; const struct mg_request_info *ri = mg_get_request_info(conn); int len = (int)ri->content_length; if (len <= 0 || len > 4096) len = 4096; std::vector<char> post_data(len + 1); int n = mg_read(conn, post_data.data(), len); post_data[n] = '\0'; char product_id_str[32] = {0}, sender[128] = {0}, receiver[128] = {0}, message[1024] = {0}; mg_get_var(post_data.data(), n, "product_id", product_id_str, sizeof(product_id_str)); mg_get_var(post_data.data(), n, "sender", sender, sizeof(sender)); mg_get_var(post_data.data(), n, "receiver", receiver, sizeof(receiver)); mg_get_var(post_data.data(), n, "message", message, sizeof(message)); fprintf(stderr, "Attempting to send message: product_id=%s, sender=%s, receiver=%s, message=%s\n", product_id_str, sender, receiver, message); sqlite3 *db = safe_open("C:/Users/priva/OneDrive/Desktop/supplierbuyer/products.db"); const char *sql = "INSERT INTO messages (product_id, sender, receiver, message) VALUES (?, ?, ?, ?);"; sqlite3_stmt *stmt = nullptr; sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr); sqlite3_bind_int(stmt, 1, atoi(product_id_str)); sqlite3_bind_text(stmt, 2, sender, -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 3, receiver, -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 4, message, -1, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); sqlite3_close(db); mg_printf(conn, "HTTP/1.1 201 Created\r\nContent-Length: 0\r\n\r\n"); return 201; }, nullptr); // GET /api/conversation 聊天记录获取接口 mg_set_request_handler(ctx, "/api/conversation", [](mg_connection *conn, void *) -> int { const mg_request_info *ri = mg_get_request_info(conn); char product_id_str[32] = {0}; if (ri->query_string) { mg_get_var(ri->query_string, strlen(ri->query_string), "product_id", product_id_str, sizeof(product_id_str)); } int product_id = atoi(product_id_str); sqlite3 *db = safe_open("C:/Users/priva/OneDrive/Desktop/supplierbuyer/products.db"); const char *sql = R"( SELECT sender, receiver, message, strftime('%Y-%m-%d %H:%M:%S', created_at) FROM messages WHERE product_id = ? ORDER BY id ASC; )"; sqlite3_stmt *stmt = nullptr; sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr); sqlite3_bind_int(stmt, 1, product_id); std::string json = "["; bool first = true; while (sqlite3_step(stmt) == SQLITE_ROW) { if (!first) json += ","; first = false; const char *sender = (const char *)sqlite3_column_text(stmt, 0); const char *receiver = (const char *)sqlite3_column_text(stmt, 1); const char *message = (const char *)sqlite3_column_text(stmt, 2); const char *created_at = (const char *)sqlite3_column_text(stmt, 3); char buf[512]; snprintf(buf, sizeof(buf), R"({"sender":"%s","receiver":"%s","message":"%s","created_at":"%s"})", sender, receiver, message, created_at); json += buf; } json += "]"; sqlite3_finalize(stmt); sqlite3_close(db); mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n%s", json.c_str()); return 200; }, nullptr);
我已经排查过的内容
- 发送消息后确实调用了
loadConversation()函数(加了console.log验证执行流程) - SQLite数据库里能看到新插入的消息记录,所有字段值都正确
- 手动访问
/api/conversation?product_id=3能返回包含新消息的JSON数组(但还没仔细检查JSON格式是否有语法错误)
现在实在找不到问题出在哪,有没有大佬能帮我分析一下可能的原因?比如前端的消息渲染逻辑、后端的JSON生成是否有坑,或者CivetWeb的响应头有没有隐藏问题?




