我如何绕过 Angular 用自己的猴子补丁撤消我的猴子补丁?
How do I get around Angular undoing my monkey patching with its own monkey patching?
我想拦截对 Google 地图 API 的 XHR 请求,这样我就可以 运行 通过我自己的代理服务器将它们 API ] 私钥。
Angular 有自己的 HttpInterceptor
,但它们只会拦截使用 Angular 的 HttpClient
发出的 XHR 请求,而不拦截任何外部发出的请求地图 API 的 Angular 框架。我认为 monkey patching XMLHttpRequest.open()
是处理发送到地图 API 请求的最佳方式,我是这样做的:
var oldXHROpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, username, password) {
console.log(url);
return oldXHROpen.apply(this, arguments);
};
上面的代码放在我的index.html
的<head>
段的<script>
里面,所以肯定是在Angular代码执行之前先执行的。
补丁有效... 时间很短。我看到 URLs 为我的代码加载的一些资产注销,但随后出现此消息:
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
在那之后,只有一个 URL 被记录,这是我最后一次拦截。 XHR 请求继续被处理,但我的补丁从未看到它们发生。
我确定这与 zone.js 有关,但我仍然不明白它是如何发生的。由于我在 Angular 或 zone.js 之前重新定义了 XMLHttpRequest.prototype.open
甚至有机会看到原始的 open()
函数,它隐藏在 oldXHROpen
变量中,如何与本机的直接连接 open()
曾经设法再次发生,绕过我的补丁?
看来我是在错误的前提下工作,即 Google 地图 API 的客户端必须发出 XHR 请求才能完成其工作。
没有。这一切都是通过加载图像、CSS 和字体来完成的,并添加了一些 JSONP。
我的猴子补丁确实有效,不会被Angular撤消。
我想拦截对 Google 地图 API 的 XHR 请求,这样我就可以 运行 通过我自己的代理服务器将它们 API ] 私钥。
Angular 有自己的 HttpInterceptor
,但它们只会拦截使用 Angular 的 HttpClient
发出的 XHR 请求,而不拦截任何外部发出的请求地图 API 的 Angular 框架。我认为 monkey patching XMLHttpRequest.open()
是处理发送到地图 API 请求的最佳方式,我是这样做的:
var oldXHROpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, username, password) {
console.log(url);
return oldXHROpen.apply(this, arguments);
};
上面的代码放在我的index.html
的<head>
段的<script>
里面,所以肯定是在Angular代码执行之前先执行的。
补丁有效... 时间很短。我看到 URLs 为我的代码加载的一些资产注销,但随后出现此消息:
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
在那之后,只有一个 URL 被记录,这是我最后一次拦截。 XHR 请求继续被处理,但我的补丁从未看到它们发生。
我确定这与 zone.js 有关,但我仍然不明白它是如何发生的。由于我在 Angular 或 zone.js 之前重新定义了 XMLHttpRequest.prototype.open
甚至有机会看到原始的 open()
函数,它隐藏在 oldXHROpen
变量中,如何与本机的直接连接 open()
曾经设法再次发生,绕过我的补丁?
看来我是在错误的前提下工作,即 Google 地图 API 的客户端必须发出 XHR 请求才能完成其工作。
没有。这一切都是通过加载图像、CSS 和字体来完成的,并添加了一些 JSONP。
我的猴子补丁确实有效,不会被Angular撤消。