Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google maps 谷歌地图Javascript API v3中随机出现的不从谷歌地图加载API错误_Google Maps_Google Maps Api 3 - Fatal编程技术网

Google maps 谷歌地图Javascript API v3中随机出现的不从谷歌地图加载API错误

Google maps 谷歌地图Javascript API v3中随机出现的不从谷歌地图加载API错误,google-maps,google-maps-api-3,Google Maps,Google Maps Api 3,我的webapp在html头部加载Google Maps JS API v3,如下所示: <head> <script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&libraries=places"></script> </head> 我还使用newerror(),捕获了调用gm\u authFailure的调用堆栈。堆栈输出以下内容,建

我的webapp在html头部加载Google Maps JS API v3,如下所示:

    <head>
    <script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&libraries=places"></script>
    </head>
  • 我还使用
    newerror(),捕获了调用
    gm\u authFailure
    的调用堆栈。堆栈
    输出以下内容,建议使用。正在从Maps.googleapis.com和b.com加载地图库。错误发生在库身份验证时,而不是调用库来使用它

    at gm_authFailure (https://EXAMPLE.COM/MY_PATH:3276:22)
        at https://maps.googleapis.com/maps-api-v3/api/js/40/7/common.js:73:368
            at Qp.o (https://maps.googleapis.com/maps-api-v3/api/js/40/7/common.js:149:177)
                at Object.c [as _tj1nu1] (https://maps.googleapis.com/maps-api-v3/api/js/40/7/common.js:67:84)
                    at https://maps.googleapis.com/maps/api/js/AuthenticationService.Authenticate?1shttps%3A%2F%EXAMPLE.COM%2FMY_PATH&4sMY_API_KEY&callback=_xdc_._tj1nu1&key=MY_API_KEY&token=18280:1:28
    
  • 假设:

  • 受影响用户的某些应用程序、浏览器扩展或手机数据保存功能会阻止或缓存地图库,从而混淆地图库
  • 奇怪的是,在
    gmu authFailure
    callstack中,启动的“”URL列出了两次我的API键
  • 我知道的事情:

  • 调用
    gm\u authFailure
    时,库将不再工作,例如,我无法创建新映射:

    var test_map = new google.maps.Map(document.getElementById("test_google_map"), {"zoom":2})
    console.log(test_map.zoom)
    
    是未定义的,而不是2

  • 触发此错误的用户通常在没有错误加载的相同和不同日期有其他记录的页面加载
  • 我无法使用同一设备/浏览器再现错误&访问同一页面
  • 尽管这种情况只发生在约1%的页面负载中,但每天发生约100次,所以我相信这不是偶然的

  • 我们通过以下方式修复了错误:

    通常,您会像这样插入google maps脚本:

        <head>
        <script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&libraries=places"></script>
        </head>
    
    
    
    更改后,用脚本替换上面的脚本标记:

    
    (功能(){
    //一些浏览器将google maps脚本缓存很长时间,这使得令牌过期。
    //为了解决这个问题,我们强制浏览器在12小时后重新蚀刻脚本。这不会有太大的影响
    //对性能有很大影响,因为脚本的内容每天都在更改,所以缓存无效
    //无论如何。
    var GOOGLE\u MAPS\u INVALIDATE\u INTERVAL=12*3600*1000;
    var timestamp=Math.floor(Date.now()/GOOGLE\u MAPS\u INVALIDATE\u INTERVAL)*GOOGLE\u MAPS\u INVALIDATE\u INTERVAL;
    var src=”https://maps.googleapis.com/maps/api/js?v=quarterly&key=%YOUR_GOOGLE_MAPS_API_KEY%&libraries=geometry,places×tamp=“+timestamp;
    //必须使用document.write。如果我们使用document.body.appendChild,主代码(取决于谷歌地图)可能会在谷歌地图执行之前执行
    //TODO:我们最终应该使geoUtils成为一个异步函数,只有在GoogleMaps准备就绪时才能解决。
    document.write('\u003c/script>');//如果不使用unicode转义(\u003c),浏览器将认为外部脚本已关闭。
    })();
    
    说明:

    每次发生错误时,用户似乎在一天或几天前访问过该页面

    据报道,谷歌地图api的会议持续24小时。会话到期后,将不会从GoogleMapsError加载API

    对的请求包含一个参数“token=xxx”。当令牌不正确时,就会发生错误

    令牌的值是从请求url和一些幻数中计算出来的,这些幻数在加载自的脚本(加载google地图的初始脚本)中定义。脚本中的魔法数字每天都在变化

    在用户离开页面并返回后,浏览器似乎进行了“快速恢复”,这将从缓存加载脚本内容,而不是遵守缓存控制。但是缓存中的幻数已过期,因此会发生错误

    但是如果我们用一些带有时间戳的代码替换脚本标记,我们可以确保脚本内容在“快速恢复”之后重新加载