Получение 2 HTTP-запросов на сервере при отправке только 1

Я создаю приложение и использую среду http://c9.io для его разработки. Это приложение NodeJS, которое предоставляет некоторые конечные точки REST для запросов клиентского приложения. До сих пор все работало нормально, и сегодня я наблюдаю, что на 1 вызов, отправленный браузером в REST API, 2 запроса отображаются как полученные, и обработчик запросов вызывается 2 раза. Это замедлило время ответа на один запрос.

В инструментах разработчика Chrome отображается только один отправленный запрос, однако я использую app.use() для регистрации входящих запросов в Express, и он печатает одно и то же 2 раза для каждого запроса. Кроме того, обработчик вызывается дважды.

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

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

app.get('/suggestions/:keyword', function(r, s) {
    sug_db.retrieveSuggestions(r.params.keyword, function(data) {
        s.writeHead(200, {'content-type': 'text/html'});
        s.write(renderSugg({data: data}))
        s.end();
    });
});

app.get('/search/:query', function(r, s) {
    esc_db.search(r.params.query, function(data) {
        s.send(renderResults({query: r.params.query, results:data}));
    });
});

Как видите, они ничего не делают, кроме как получают некоторые данные из базы данных и возвращают результат в виде HTTP-ответа. Я использую шаблонизатор Pug (ранее Jade).


person aditya_medhe    schedule 20.09.2016    source источник
comment
developer.mozilla.org/en-US/docs/Web/ HTTP/   -  person Dark Falcon    schedule 20.09.2016
comment
Это не вызов CORS. Кроме того, если бы он был отправлен браузером, он бы отображался в Инспекторе, верно?   -  person aditya_medhe    schedule 20.09.2016
comment
@aditya_m Да, запрос CORS будет отображаться в инспекторе. Кроме того, это будет запрос OPTION, который, вероятно, не будет обрабатываться одним и тем же обработчиком. Трудно что-либо сказать, не видя кода вашего обработчика.   -  person rsp    schedule 20.09.2016
comment
Добавил код в редактирование. Но обратите внимание, что я не изменил этот код до того, как проблема начала возникать.   -  person aditya_medhe    schedule 20.09.2016


Ответы (1)


Не похоже, что код, который вы включили в вопрос, может выполняться дважды. Но, возможно, это делает какой-то код в sug_db.retrieveSuggestions или esc_db.search.

Я бы сделал следующее:

Добавьте логирование внутри кода, который вы предоставили, как перед вызовом функций, так и внутри обратного вызова:

app.get('/suggestions/:keyword', function(r, s) {
    console.log('*** GET /suggestions/:keyword handler');
    sug_db.retrieveSuggestions(r.params.keyword, function(data) {
        console.log('GET /suggestions/:keyword callback');
        s.writeHead(200, {'content-type': 'text/html'});
        s.write(renderSugg({data: data}))
        s.end();
    });
});

app.get('/search/:query', function(r, s) {
    console.log('*** GET /search/:query handler');
    esc_db.search(r.params.query, function(data) {
        console.log('GET /search/:query callback');
        s.send(renderResults({query: r.params.query, results:data}));
    });
});

(или измените console.log на любой метод ведения журнала, который вы используете). Я бы увидел, что на самом деле вызывается дважды - сами обработчики, или обратные вызовы, или ничего. Далее будет проверка функций, которые на самом деле вызываются обработчиками:

  • sug_db.retrieveSuggestions()
  • esc_db.search()
  • renderSugg()
  • renderResults()

Важно увидеть, что на самом деле вызывается дважды, а затем изучить, почему это может происходить. Но это может произойти, если, например, вы сделаете что-то вроде:

function badFunction(data, callback) {
  if (something) {
    callback('error');
  }
  callback('ok');
}

вместо:

function goodFunction(data, callback) {
  if (something) {
    callback('error');
  } else {
    callback('ok');
  }
}

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

person rsp    schedule 20.09.2016
comment
Да, я добавил console.log в сами обработчики запросов, и они вызываются дважды. Но дело в том, что даже промежуточное ПО app.use(), которое я использую для регистрации каждого запроса, показывает 2 запроса. Поскольку он выполняется перед всем этим кодом, проблема кроется где-то слишком рано, прежде чем управление достигает этого кода, верно? - person aditya_medhe; 20.09.2016
comment
@aditya_m Верно. Похоже, это что-то до того, как этот код будет достигнут. Возможно, действительно отправляются 2 сетевых запроса. Или, может быть, ваш журнал запускается дважды. Сложно сказать. На самом деле я ничего не могу посоветовать, кроме как добавить много строк console.log в ваш код и, возможно, использовать tcpdump или что-то еще, чтобы увидеть, удваиваются ли запросы в сети или только в вашем приложении. Вы также можете написать простое макетное приложение, которое всегда возвращает некоторые тестовые данные на обе эти конечные точки и смотрите, будет ли оно запускаться дважды. Очень странная проблема. - person rsp; 20.09.2016
comment
сама природа этой проблемы и характер ее возникновения (происходит в конце дня, после успешного выполнения многих запросов) указывает мне на какое-то программное обеспечение для мониторинга, которое проверяет сервер, отправляя дублирующий запрос. (Как я уже сказал, я нахожусь за высокозащищенной корпоративной сетью). Получит IP-адрес клиента и зарегистрирует его, чтобы увидеть, из какой системы поступает другой запрос. Это наверняка даст подсказку. Обновлю эту тему, если найду что-нибудь... - person aditya_medhe; 20.09.2016
comment
Я только что пришел домой и попробовал еще раз. Хлопнуть!! Работает как обычно, молниеносно. Я думаю, что виновата корпоративная сеть. - person aditya_medhe; 20.09.2016