使用Express在NodeJS上检测AJAX请求


76

我在Express上使用NodeJS。如何分辨普通浏览器请求和AJAX请求之间的区别?我知道我可以检查请求标头,但是Node / Exprsss是否公开此信息?


3
我总是用console.log()这个req对象,这样我可以检查它包含的许多有用的对象。
Akshat Jiwan Sharma

1
@AkshatJiwanSharma我也已经开始这样做了,以为我以前没有使用过这种技术真是太疯狂了!
sharkman

Answers:


129

大多数框架将X-Requested-With标头设置XMLHttpRequest为,Express对此进行了测试:

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

14
对于设置框架的框架又如何呢?像AngularJS一样?
kumarharsh 2015年

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 2015年

是的,这是一种方法,但以防万一其他懒惰的开发人员找到了其他框架,那么这是给他们的:)
kumarharsh 2015年

对于内部使用的API,我确实认为添加标头是正确的做法。如果您的API将被其他人使用,尽管确实很幸运。尽管您可能还要求开发人员添加此标头:开发人员应该足够聪明才能做到这一点。
Stephan Bijzitter,

8
您可以req.xhr通过将其添加到您的角度应用程序配置中来处理AngularJS请求: $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
steampowered 2016年

4
@kumar_harsh他没有提供完整的代码行,但是我提供了。所以我添加了一些尚未提供的信息。
蒸汽动力
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.