gpt4 book ai didi

google-maps - Google Maps Javascript API v3 随机发生 NotLoadingAPIFromGoogleMapsError

转载 作者:行者123 更新时间:2023-12-04 10:15:17 25 4
gpt4 key购买 nike

我的 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>

一切正常,除了大约 100 次移动网页浏览中的 1 次,谷歌地图将回调全局 gm_authFailure ,根据 Google 的说法,当“身份验证失败” https://developers.google.com/maps/documentation/javascript/events#auth-errors 时会发生这种情况

为了调试,我从文档加载中捕获整个控制台日志,并且在我的全局 gm_authFailure 中功能:
  • 我正在打印 gm_authFailure 之前的日志被调用时,始终显示以下内容,根据文档,当 Google 确定未从 https://maps.googleapis.com/maps/api/js 加载 map 库时会发生这种情况:
    Google Maps JavaScript API error: NotLoadingAPIFromGoogleMapsError
    https://developers.google.com/maps/documentation/javascript/error-messages#not-loading-api-from-google-maps-error
  • 我还在捕获调用 gm_authFailure 的调用堆栈。 , 使用 new Error().stack它输出以下内容,这表明a。 map 库正在从 maps.googleapis.com 加载,并且 b。该错误发生在库身份验证时,而不是调用库来使用它。
    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

  • 假设:
  • 受影响的用户有一些应用程序、浏览器扩展程序或蜂窝数据保存功能会阻止或缓存 map 库,从而混淆 map 库
  • 奇怪的是在gm_authFailure调用堆栈,启动 ' https://maps.googleapis.com/maps/api/js/AuthenticationService.Authenticate ' URL 是否列出了我的 API key 两次?

  • 我知道的事情:
  • gm_authFailure被调用,图书馆将不再工作,例如我无法创建新 map :
    var test_map = new google.maps.Map(document.getElementById("test_google_map"), {"zoom":2})
    console.log(test_map.zoom)

    与 2
  • 相反,未定义
  • 触发此错误的用户通常在同一天和不同天有其他记录的页面加载,加载时没有错误。
  • 我无法使用相同的设备/浏览器重现错误并访问相同的页面
  • 尽管这种情况仅发生在约 1% 的页面加载中,但它每天发生约 100 次,所以我相信这不是侥幸。
  • 最佳答案

    我们通过这种方式修复了错误:
    通常你插入谷歌地图脚本是这样的:

    <script src="https://maps.googleapis.com/maps/api/js?v=quarterly&key=%YOUR_GOOGLE_MAPS_API_KEY%&libraries=geometry,places"></script>
    更改后,将上述脚本标记替换为脚本:
        <script>
    (function () {
    // Some browsers caches the google maps script for a long time, which makes the token expired.
    // In order to solve this, we force the browser to refetch the script after 12 hours. This won't have too
    // much impact on performance, because the content of the script changes every day, so the cache is invalidated
    // anyway.
    var GOOGLE_MAPS_INVALIDATE_INTERVAL = 12 * 3600 * 1000;
    var timestamp = Math.floor(Date.now() / GOOGLE_MAPS_INVALIDATE_INTERVAL) * GOOGLE_MAPS_INVALIDATE_INTERVAL;

    var src = "https://maps.googleapis.com/maps/api/js?v=quarterly&key=%YOUR_GOOGLE_MAPS_API_KEY%&libraries=geometry,places&timestamp=" + timestamp;
    // Must use document.write. If we use document.body.appendChild, the main code (which depends on google map) might be executed before google maps is executed
    // TODO: we should finally make the geoUtils to be an async function, that only resolves when google maps is ready.
    document.write('<script src="'+src + '">\u003c/script>'); // if not using unicode escape (\u003c), browser will think the outside script is closed.
    })();
    </script>

    解释:
    每次发生错误时,用户似乎在一天或几天前访问过该页面。
    根据 NotLoadingAPIFromGoogleMapsError even when loading correct URL , google maps api 的 session 持续 24 小时。 session 过期后会发生 NotLoadingAPIFromGoogleMapsError。
    https://maps.googleapis.com/maps/api/js/AuthenticationService.Authenticate 的请求包含一个参数“token=xxx”。当 token 不正确时,就会发生错误。
    token 的值是根据请求 url 和一些魔数(Magic Number)计算出来的,这些魔数(Magic Number)在从 https://maps.googleapis.com/maps/api/js 加载的脚本中定义。 (加载谷歌地图的初始脚本)。脚本中的魔数(Magic Number)每天都在变化。
    在用户离开页面并返回后,浏览器似乎做了一个“快速恢复”,这将从缓存中加载脚本内容,而不是尊重缓存控制。但是缓存中的魔数(Magic Number)已经过期,所以发生了错误。
    但是如果我们用一些带时间戳的代码替换脚本标签,我们可以确保在“快速恢复”之后重新加载脚本内容。

    关于google-maps - Google Maps Javascript API v3 随机发生 NotLoadingAPIFromGoogleMapsError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61092932/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com