При отправке сообщения в журнале сервера отображается следующее:
Код: Выделить всё
Attempting to send message: product_id=3, sender=1, receiver=Admin, message=1
Однако новое сообщение не появляется на странице чата (
Код: Выделить всё
message_feature.htmlВот что у меня есть:
Фронтенд (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 = `${m.message}`;
box.appendChild(div);
});
}
Бэкенд (C++ с CivetWeb)
Код: Выделить всё
mg_set_request_handler(ctx, "/send_message", [](mg_connection *conn, void *) -> int {
char product_id_str[32], sender[128], receiver[128], message[1024];
mg_get_var(...);
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(PRODUCTS_DB_PATH);
const char *sql = "INSERT INTO messages (product_id, sender, receiver, message) VALUES (?, ?, ?, ?);";
...
return 201;
}, nullptr);
mg_set_request_handler(ctx, "/api/conversation", [](mg_connection *conn, void *) -> int {
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;
)";
...
}, nullptr);
Я также проверил, что 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.');
}
});
Однако даже в этом случае окно чата не обновляется — оно по-прежнему не показывает сообщений, хотя /send_message регистрирует вставку на сервере.
Я также попробовал добавить небольшую задержку перед вызовом loadConversation() (используя setTimeout(loadConversation, 1000)), но это не имело значения — сообщения по-прежнему не отображаются.
Вопрос:
Даже несмотря на то, что сообщения вставлены (в журнале показано, что они отправлены), они не появляются при получении из /api/conversation.
Что может вызвать интерфейс не отображает их — проблема с запросом, ответом JSON или рендерингом DOM?
Что я пробовал
- Я проверил, что конечная точка /send_message работает — она регистрируется
каждый раз, когда я нажимаю Отправить.
Код: Выделить всё
Attempting to send message: product_id=3, sender=1, receiver=Admin, message=1 - Я проверил, что сообщение вставлено в базу данных SQLite (таблица) вручную с помощью браузера БД.
Код: Выделить всё
messages - Я подтвердил, что /api/conversation?product_id=3 возвращает массив JSON, но иногда он пустой или отсутствует новое сообщение.
- Я также добавил console.log(msgs) внутри loadConversation() в message_feature.html — в консоли отображается пустой массив [], хотя сообщение существует в БД.
- Я пробовал вызывать loadConversation() сразу после отправки (и тоже с 3-секундным интервалом), но окно чата по-прежнему не обновляется.
Я ожидал, что после отправки сообщения новое сообщение:
- Будет вставлено в таблицу сообщений.
- Появится сразу же в окно чата под правильной стороной (или получено).
Код: Выделить всё
sent - Также отображается в представлении администратора () через несколько секунд (поскольку он обновляется автоматически).
Код: Выделить всё
messageadmin.html
Подробнее здесь: https://stackoverflow.com/questions/797 ... shows-it-w
Мобильная версия