You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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);

我已经排查过的内容

  1. 发送消息后确实调用了loadConversation()函数(加了console.log验证执行流程)
  2. SQLite数据库里能看到新插入的消息记录,所有字段值都正确
  3. 手动访问/api/conversation?product_id=3能返回包含新消息的JSON数组(但还没仔细检查JSON格式是否有语法错误)

现在实在找不到问题出在哪,有没有大佬能帮我分析一下可能的原因?比如前端的消息渲染逻辑、后端的JSON生成是否有坑,或者CivetWeb的响应头有没有隐藏问题?

火山引擎 最新活动