使用Google API JavaScript客户端时出现未压缩的类型错误

Uncaught TypeError when using Google API JavaScript Client

本文关键字:未压缩 类型 错误 Google API JavaScript 客户端 使用      更新时间:2023-09-26

我正在使用云端点在谷歌应用程序引擎上开发一个简单的Tic-Tac-Toe。我的API名称是tictactoe2D。在我的API中,我只有一个名为tictactoe2D.compute2DMove()的端点方法,我已经在API资源管理器中测试了它,并且运行得非常好。

现在我正在创建游戏的前端,并使用Google API JavaScript客户端库与我的端点方法进行通信。我遵循了与Getting Started页面中所示完全相同的过程,这是一个关于使用库的完整教程。

以下是board.html的代码片段,加载Javascript库-

<head>
    <title>Tic Tac Toe 3D</title>
    <meta http-equiv="content-type" charset="utf-8" content="text/html"/>
    <link href="css/main.css" rel="stylesheet" type="text/css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://apis.google.com/js/client.js?onload=onLoadCallback"></script>
    <script type="text/javascript">
        function onLoadCallback()   {
           gapi.client.setApiKey('AIzaSyB7p7mH_vZGgtrbF4ntmKN2nBcsRyRFY1w');
           gapi.client.load('tictactoe2D', 'v1');   
       }
   </script>
   <script type="text/javascript" src="js/render.js"></script>
</head>

这是render.js中的代码,添加了处理所有方块的点击事件的功能,还与我的端点方法通信-

$(document).ready(function() {
    $("#board td").click(function() {
        $(this).html("X");
        var boardString = [];
        var buttons = document.querySelectorAll('td');
        for (var i=0; i<buttons.length; i++)    {
            boardString.push(buttons[i].innerHTML);
        }
        boardString.join('');
        gapi.client.tictactoe2D.compute2DMove({'state': boardString}).execute(function(resp)    {
            document.write(resp.result.state);
        });
    });
});

这是整个代码的JSFiddle。

当我试图点击游戏板上的一个方块时,会出现问题。出乎意料的是,什么都没发生我在Chrome中打开了JavaScript控制台,发现每当我点击一个正方形时,控制台都会显示以下错误

       Uncaught TypeError: Cannot read property 'compute2DMove' of undefined

我一直不知道为什么会发生这种情况,我该如何解决。有人能帮我吗?事先非常感谢。

在JS控制台上观察到一个新错误后,我自己修复了这个错误-错误是-

Failed to load resource: The server responded with a status of 403 (Forbidden)

我检查了服务器返回的JSON对象,该对象是这样的——

{"error":{"errors":[{"domain":"global","reason":"sslRequired","message":"SSL is required to perform this operation."}],"code":403,"message":"SSL is required to perform this operation."}}

看到这一点后,我猜测没有使用安全连接(HTTPS)连接到应用程序,这就是为什么服务器没有加载所需的数据。为了解决这个问题,我需要强制要求每次加载应用程序时都要使用安全连接为此,我在web.xml-中添加了以下标签

<security-constraint>
   <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
   </user-data-constraint>
</security-constraint>

我在appspot上更新了我的应用程序,并查看了JS控制台那里没有错误,我的端点方法也执行了我希望这些信息对任何面临类似问题的人都有帮助。

此外,我发现gapi库在过去存在一些稳定性问题,并且保护API调用不受任何可能的缺陷的影响的最佳方法是使用gapi.client.request()构建REST请求,而不是使用JSON-RPC请求(请参阅,使用gap.client.request构造REST请求)。构造REST请求可能很长很麻烦,但也很安全。