2013-04-11 90 views
57

我正在使用NodeJS和Express。我该如何区分普通的浏览器请求和AJAX请求?我知道我可以检查请求标题,但Node/Exprsss是否公开这些信息?使用Express在NodeJS上检测AJAX请求

+3

我总是安慰。 log()req对象。这样我可以检查它包含的许多有用的对象。 – 2013-04-11 10:13:34

+1

@AkshatJiwanSharma我也开始这样做了,以为我之前没有使用这种技术是疯狂的! – sharkman 2013-07-18 18:48:43

回答

102

大多数框架设置X-Requested-WithXMLHttpRequest,为表达有一个测试:

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

正是我想要的,谢谢。 – michael 2013-04-11 09:47:57

+9

以及**不设置它的框架是什么?像AngularJS一样? – 2015-02-16 11:30:59

35

万一req.xhr没有设置,在框架如Angularjs,where it was removed说,那么你也应该检查头部是否可以接受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”飞行前的问题更好的解决方案,但它是如何掌握现在...

+0

我也喜欢链接中建议的解决方案:如果您依赖此功能,只需将'X-Requested-With'添加回'$ httpProvider'。 – robertklep 2015-02-16 15:49:16

+0

是的,这是一种方式,但是为了防止其他框架与懒惰的开发者一起被发现,那么对他们来说:) – 2015-02-17 07:10:42

+0

对于内部使用的API,我确实认为添加回头是正确的。如果你的API将被其他人使用,尽管运气确实如此。尽管您也可以要求开发人员添加此标题:开发人员应该足够聪明,能够做到这一点。 – 2016-01-22 15:24:21

相关问题