Erkennen von AJAX-Anforderungen auf NodeJS mit Express

75

Ich verwende NodeJS mit Express. Wie kann ich den Unterschied zwischen einer normalen Browseranforderung und einer AJAX-Anforderung erkennen? Ich weiß, dass ich die Anforderungsheader überprüfen konnte, aber macht Node / Exprsss diese Informationen verfügbar?

Michael
quelle
3
Ich habe immer console.log () das req-Objekt. Auf diese Weise kann ich eine Reihe nützlicher Objekte überprüfen, die es enthält.
Akshat Jiwan Sharma
1
@AkshatJiwanSharma Ich habe auch damit begonnen, es ist verrückt zu glauben, dass ich diese Technik vorher nicht angewendet habe!
Sharkman

Antworten:

129

Die meisten Frameworks setzen den X-Requested-WithHeader auf XMLHttpRequest, für den Express einen Test hat:

app.get('/path', function(req, res) {
  var isAjaxRequest = req.xhr;
  ...
});
Robertklep
quelle
14
und was für Frameworks, die es nicht setzen? Wie AngularJS?
Kumarshar
47

Falls das req.xhrnicht festgelegt ist, z. B. in Frameworks wie Angularjs, in denen es entfernt wurde , sollten Sie auch prüfen, ob der Header eine JSON-Antwort (oder XML oder was auch immer Ihr XHR als Antwort anstelle von HTML sendet) akzeptieren kann.

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

Natürlich müssen Sie den zweiten Teil ein wenig anpassen, um ihn an Ihren Anwendungsfall anzupassen, aber dies sollte eine vollständigere Antwort sein.

Idealerweise hätte das eckige Team es nicht entfernen sollen, sondern tatsächlich eine bessere Lösung für das Problem des CORS vor dem Flug finden sollen, aber so ruht es jetzt ...

kumarharsh
quelle
Ich mag auch die im Link vorgeschlagene Lösung: Fügen Sie einfach die X-Requested-WithRückseite hinzu, $httpProviderwenn Sie von dieser Funktionalität abhängig sind.
Robertklep
Ja, das ist eine Möglichkeit, aber nur für den Fall, dass andere Frameworks mit ebenso faulen Entwicklern gefunden werden, dann ist es für sie :)
Kumarharsh
Für eine API für den internen Gebrauch halte ich das Hinzufügen des Headers für das Richtige. Wenn Ihre API von anderen verwendet wird, obwohl Glück in der Tat. Obwohl Entwickler möglicherweise auch diesen Header hinzufügen müssen: Entwickler sollten klug genug sein, um dies zu tun.
Stephan Bijzitter
8
Sie können req.xhrfür AngularJS-Anforderungen arbeiten, indem Sie dies zu Ihrer $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
Angular-
4
@kumar_harsh er hat nicht die vollständige Codezeile bereitgestellt, aber ich habe es getan. Also fügte ich einige Informationen hinzu, die noch niemand zur Verfügung gestellt hatte.
Steampowered