使用 Express 检测 NodeJS 上的 AJAX 请求

Posted

技术标签:

【中文标题】使用 Express 检测 NodeJS 上的 AJAX 请求【英文标题】:Detecting AJAX requests on NodeJS with Express 【发布时间】:2013-04-03 10:21:50 【问题描述】:

我将 NodeJS 与 Express 一起使用。如何区分普通浏览器请求和 AJAX 请求?我知道我可以检查请求标头,但 Node/Exprsss 是否公开了这些信息?

【问题讨论】:

我总是 console.log() req 对象。这样我可以检查它包含的许多有用的对象。 @AkshatJiwanSharma 我也开始这样做了,想想我以前没有使用过这种技术真是太疯狂了! 【参考方案1】:

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

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

【讨论】:

对于那些设置它的框架呢?喜欢 AngularJS?【参考方案2】:

如果 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

当然,您必须稍微调整第二部分以匹配您的用例,但这应该是一个更完整的答案。

理想情况下,Angular 团队不应该将其移除,但实际上应该为 CORS 的飞行前问题找到更好的解决方案,但现在就是这样......

【讨论】:

我也喜欢链接中建议的解决方案:如果您依赖此功能,只需将X-Requested-With 添加回$httpProvider 是的,这是一种方法,但以防万一发现其他框架也有同样懒惰的开发人员,那么它就是为他们准备的 :) 对于供内部使用的 API,我确实认为添加标头是正确的做法。如果您的 API 将被其他人使用,尽管确实很幸运。尽管您也可以要求开发人员添加此标头:开发人员应该足够聪明才能做到这一点。 您可以通过将 req.xhr 添加到您的 Angular 应用配置中来使 req.xhr 为 AngularJS 请求工作:$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; @kumar_harsh 他没有提供完整的代码行,但我提供了。所以我添加了一些尚未提供的信息。

以上是关于使用 Express 检测 NodeJS 上的 AJAX 请求的主要内容,如果未能解决你的问题,请参考以下文章

Cpanel 上的 Express/NodeJS 应用程序

express + nodeJS上的404错误,在正常路线上

NodeJS Express - 同一端口上的两个 NodeJS 实例(vhost)

关系表上的NodeJS PostgreSQL Express SequelizeEagerLoadingError

对于express框架的基本理解

nodejs的express使用介绍