Почему мое сообщение не отображается на странице, хотя журнал сервера показывает, что оно было успешно отправлено в CiveJavascript

Форум по Javascript
Ответить
Anonymous
 Почему мое сообщение не отображается на странице, хотя журнал сервера показывает, что оно было успешно отправлено в Cive

Сообщение Anonymous »

Я создаю функцию локального веб-чата, используя CivetWeb (C++), SQLite и интерфейс на простом HTML/JS.
При отправке сообщения в журнале сервера отображается следующее:

Код: Выделить всё

Attempting to send message: product_id=3, sender=1, receiver=Admin, message=1
Таким образом, конечная точка /send_message срабатывает правильно.
Однако новое сообщение не появляется на странице чата (

Код: Выделить всё

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);
Сообщения сохраняются в том же файле Products.db в таблице messages.
Я также проверил, что loadConversation() запускается после отправки сообщения, но в окне чата ничего не отображается.

Вопрос:
Несмотря на то, что сообщения вставлены (в журнале показано, что они отправлены), они не отображаются при получении из /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 секунды), но окно чата по-прежнему не обновляется.
Чего я ожидал
Я ожидал, что после отправки сообщения новое сообщение:
  • Будет вставлено в таблицу сообщений.
  • Появится сразу же в окно чата под правильной стороной ( или получено).
  • Также отображается в представлении администратора (

    Код: Выделить всё

    messageadmin.html
    ) через несколько секунд (поскольку он обновляется автоматически).


Подробнее здесь: https://stackoverflow.com/questions/797 ... shows-it-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»