Виявлення запитів AJAX на NodeJS за допомогою Express


76

Я використовую NodeJS з Express. Як я можу відрізнити звичайний запит браузера від запиту AJAX? Я знаю, що міг перевірити заголовки запитів, але чи надає Node / Exprsss цю інформацію?


3
Я завжди console.log () об'єкт req. Таким чином я можу перевірити ряд корисних об'єктів, які він містить.
Акшат Джіван Шарма

1
@AkshatJiwanSharma Я теж почав це робити, божевільно думати, що раніше не використовував цю техніку!
sharkman

Відповіді:


129

Більшість фреймворків встановлюють для X-Requested-Withзаголовка значення XMLHttpRequest, для якого Express має тест:

app.get('/path', function(req, res) {
  var isAjaxRequest = req.xhr;
  ...
});

14
а що до фреймворків, які цього не встановлюють? Подобається AngularJS?
кумархарш,

48

Якщо значення req.xhrне встановлено, скажімо у таких фреймворках, як Angularjs, де його було видалено , тоді вам слід також перевірити, чи може заголовок прийняти відповідь JSON (або XML, або що інше, що ваш XHR надсилає як відповідь замість HTML).

if (req.xhr || req.headers.accept.indexOf('json') > -1) {
  // send your xhr response here
} else {
  // send your normal response here
}

Звичайно, вам доведеться трохи підправити другу частину, щоб вона відповідала вашому випадку використання, але це має бути більш повною відповіддю.

В ідеалі, команда з кутових не повинна була його видаляти, а насправді повинна була знайти краще рішення для передпольотної проблеми CORS, але ось як це тримається зараз ...


Мені також подобається рішення, запропоноване за посиланням: просто додайте X-Requested-Withназад, $httpProviderякщо ви залежате від цієї функціональності.
robertklep

Так, це один зі способів, але на той випадок, якщо будуть знайдені інші фреймворки з настільки ж ледачими розробниками, тоді це для них :)
kumarharsh

Що стосується API для внутрішнього використання, я вважаю, що додавання заголовка назад - це належне. Якщо ваш API буде використовуватися іншими, хоч справді пощастить. Хоча ви можете вимагати, щоб розробники також додали цей заголовок: розробники повинні бути достатньо розумними, щоб мати можливість це робити.
Stephan Bijzitter

8
Ви можете зробити req.xhrроботу з запитами AngularJS, додавши це до конфігурації кутового додатка: $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
steampowered

4
@kumar_harsh він не вказав повний рядок коду, але я надав. тому я додав деяку інформацію, яку ще ніхто не надавав.
паровий двигун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.