Сервер отправил ответ, но Клиент не загружает отправленный контент - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть простой сервер узлов (рендеринг nodejs + express + ejs) , когда пользователь пытался загрузить определенный сервер страниц, отправляет тот скомпилированный html и отправляет его в ответ.

Для отслеживания пользователей я добавил 2 счетчика

a.счетчик, который увеличивается, когда сервер получает запрос на эту страницу

b.когда клиент загружает страницу, он содержит один некоторый код, который отправляет HTTP-запросы обратно на мой сервер, который я использую в качестве счетчика

Теперь проблема заключается в том, что с течением времени разница между sentResponse counter и clientLoadувеличение счетчика увеличивается настолько, что я получаю sentResponse = 7000 и clientLoad = 3600.

Любые предложения о том, что может вызвать такое поведение

Примечание: я также настроил Cloudfare до того, как запросы достигнут моегосервер, и я приостановил его, но все же у меня были огромные различия?

Примечание: я также заметил, что многие пользователи часто делают запросы на страницу, например, несколько раз под 4, но я уверен, что отправляю действительный HTMLи я отличаюсь почти на 50%, поэтому я не думаю, что каждый пользователь, который посещает страницу, нажимает Ctrl + R 2 или более раз под 4 с.

Код:

server.js

app.get('/dashboard', (res, res) => {
    ...
    ...
    ...

    Tracker.incrementCount('sentResponse');
    res.render(page.ejs, {...});
});

app.get('/client-load-start', (req, res) => {
    Tracker.incrementCount('clientLoadStart');
    res.send(200);
});

page.ejs

<html>
    <head>
        ...
        <script src='/client-load-start?version=<some_random_4_digit_number>'></script>
        ...
    </head>

    <body>
        ...
        ...
    </body>
</html>

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы можете попробовать использовать методы очистки кэша.Каждый раз, когда браузер загружает /dashboard, браузер получает источник сценария для вашего /client-load-start маршрута.Проблема только в том, что /client-load-start запрашивается, когда очищается кеш браузера или при первой загрузке сайта.Это вызовет проблему, при которой два значения могут значительно различаться со временем.

Попробуйте заставить браузер думать, что /client-load-start - это новый скрипт, который необходимо загрузить.Вы можете сделать это, добавив параметры запроса в src.

<script src='/client-load-start?<%- Date.now()%>=1'></script>

Каждый раз, когда браузер переходит на /dashboard, он пытается загрузить новый скрипт, потому что параметры запроса изменились, таким образом разрушая кэш.

0 голосов
/ 18 октября 2018

Последовательность событий

  1. Запросы браузера /dashboard
  2. Сервер увеличивается sentResponse, обрабатывает и отправляет page.ejs в браузер
  3. Браузер получает page.ejs и обнаруживает тег <script>
  4. Браузер проверяет, находится ли URL-адрес скрипта в кэше браузера
    • Здесь последовательность заканчивается, если URL-адрес скрипта найден в кэше;clientLoad остается без изменений
  5. Браузер запрашивает скрипт с вашего сервера
  6. Сервер выполняет get запрос, увеличивает clientLoad

Проблема

«Проблема» в том, что браузер - или любой прокси-сервер между браузером и вашим сервером - будет кэшировать возвращаемый скрипт, если вы не укажете иное.

Обратите внимание, что кэширование действительно ожидается ипредполагаемое поведение в большинстве случаев.Это также поведение браузеров по умолчанию.

Решение

Чтобы дать указание браузеру (или прокси-серверу) избегать кэширования файла, вы можете установить заголовки управления кэшем .

app.get('/client-load-start', (req, res) => {
    Tracker.incrementCount('clientLoadStart');
    res
       .set('cache-control', 'max-age=0; private; no-cache')
       .send(200);
});

Это заставит браузер никогда не кэшировать запрос и всегда получать новую копию, увеличивая таким образом clientLoadStart с каждым запросом.

Другой способ - это " очистка кэша ", что означает, что вы намеренно изменили URL скрипта, например, добавив случайное число, как вы делали выше, тем самым" сломав "ключ кэша.

0 голосов
/ 12 октября 2018

Я могу подумать о следующих возможностях того, почему счет может отличаться.

  • Установка заголовков кэширования (Cache-Control) может привести к тому, что браузер будет кэшировать запросы.
  • JSне включен в браузере клиента, и поэтому нет возможности сделать AJAX-вызов на сервер для обновления счетчика clientLoad (это менее возможно, но все еще возможно).
  • Люди, взаимодействующие со страницейдаже до загрузки страницы, вызывающей вызов AJAX.Люди перезагрузили страницу до того, как страница могла загрузиться.

Если вы просто хотите отслеживать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...