Я создаю функцию локального веб-чата, используя CivetWeb (C++), SQLite и интерфейс на простом HTML/JS.
При отправке сообщения в журнале сервера отображается следующее:
Сообщения сохраняются в том же файле Products.db в таблице messages.
Я также проверил, что loadConversation() запускается после отправки сообщения, но в окне чата ничего не отображается.
Вот соответствующая часть моего кода message_feature.html:
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);
// Send the message to the backend
const res = await fetch('/send_message', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: body
});
// I wait for the response before refreshing messages
if (res.ok) {
document.getElementById('message').value = '';
loadConversation(); // ✅ Called right after successful response
} else {
alert('Failed to send message.');
}
});
Поэтому loadConversation() вызывается только после успешного возврата запроса POST (статус 201).
Однако даже в этом случае окно чата не обновляется — оно по-прежнему не показывает сообщений, хотя /send_message регистрирует вставку на сервере.
Я также попробовал добавить небольшую задержку перед вызовом loadConversation() (используя setTimeout(loadConversation, 1000)), но это не имело значения — сообщения по-прежнему не отображаются.
Вопрос:
Даже несмотря на то, что сообщения вставлены (в журнале показано, что они отправлены), они не появляются при получении из /api/conversation.
Что может вызвать интерфейс не отображает их — проблема с запросом, ответом JSON или рендерингом DOM?
Что я пробовал
Я проверил, что конечная точка /send_message работает — она регистрируется
Я подтвердил, что /api/conversation?product_id=3 возвращает массив JSON, но иногда он пустой или отсутствует новое сообщение.
Я также добавил console.log(msgs) внутри loadConversation() в message_feature.html — в консоли отображается пустой массив [], хотя сообщение существует в БД.
Я пробовал вызывать loadConversation() сразу после отправки (и тоже с 3-секундным интервалом), но окно чата по-прежнему не обновляется.
Чего я ожидал
Я ожидал, что после отправки сообщения новое сообщение:
Будет вставлено в таблицу сообщений.
Появится сразу же в окно чата под правильной стороной (
Я создаю функцию локального веб-чата, используя [b]CivetWeb (C++)[/b], [b]SQLite[/b] и интерфейс на простом HTML/JS. При отправке сообщения в журнале сервера отображается следующее: [code]Attempting to send message: product_id=3, sender=1, receiver=Admin, message=1 [/code] Таким образом, конечная точка /send_message срабатывает правильно. Однако новое сообщение [b]не появляется на странице чата[/b] ([code]message_feature.html[/code]), хотя я вижу, что оно было вставлено в журнал. Вот что у меня есть: [h4][b]Фронтенд (message_feature.html)[/b][/h4] [code]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 = `${m.message}`; box.appendChild(div); }); } [/code] [h4][b]Бэкенд (C++ с CivetWeb)[/b][/h4] [code]// 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 4096) len = 4096; std::vector 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));
[/code] Сообщения сохраняются в том же файле Products.db в таблице messages. Я также проверил, что loadConversation() запускается после отправки сообщения, но в окне чата ничего не отображается. Вот соответствующая часть моего кода message_feature.html: [code]document.getElementById('chatForm').addEventListener('submit', async e => { e.preventDefault();
// Send the message to the backend const res = await fetch('/send_message', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: body });
// I wait for the response before refreshing messages if (res.ok) { document.getElementById('message').value = ''; loadConversation(); // ✅ Called right after successful response } else { alert('Failed to send message.'); } }); [/code] Поэтому loadConversation() вызывается только после успешного возврата запроса POST (статус 201). Однако даже в этом случае окно чата не обновляется — оно по-прежнему не показывает сообщений, хотя /send_message регистрирует вставку на сервере. Я также попробовал добавить небольшую задержку перед вызовом loadConversation() (используя setTimeout(loadConversation, 1000)), но это не имело значения — сообщения по-прежнему не отображаются.
[b]Вопрос:[/b] Даже несмотря на то, что сообщения вставлены (в журнале показано, что они отправлены), они не появляются при получении из /api/conversation. Что может вызвать интерфейс не отображает их — проблема с запросом, ответом JSON или рендерингом DOM?
[b]Что я пробовал[/b] [list] [*]Я проверил, что конечная точка /send_message работает — она регистрируется [code]Attempting to send message: product_id=3, sender=1, receiver=Admin, message=1 [/code] каждый раз, когда я нажимаю [b]Отправить[/b].
[*]Я проверил, что [b]сообщение вставлено[/b] в базу данных SQLite ([code]messages[/code] таблица) вручную с помощью браузера БД.
[*]Я подтвердил, что /api/conversation?product_id=3 возвращает массив JSON, но иногда он [b]пустой[/b] или отсутствует новое сообщение.
[*]Я также добавил console.log(msgs) внутри loadConversation() в message_feature.html — в консоли отображается пустой массив [], хотя сообщение существует в БД.
[*]Я пробовал вызывать loadConversation() сразу после отправки (и тоже с 3-секундным интервалом), но окно чата по-прежнему не обновляется.
[/list] [b]Чего я ожидал[/b] Я ожидал, что после отправки сообщения новое сообщение: [list] [*]Будет вставлено в таблицу сообщений. [*]Появится сразу же в окно чата под правильной стороной ([code]sent[/code] или получено). [*]Также отображается в представлении администратора ([code]messageadmin.html[/code]) через несколько секунд (поскольку он обновляется автоматически). [/list]