使用Google API JavaScript客户端时未捕获的TypeError

时间:2014-08-28 05:34:29

标签: javascript jquery google-app-engine google-cloud-endpoints

我正在使用云端点在Google App引擎上开发一个简单的Tic Tac Toe。我的API名称是tictactoe2D。 我在我的API中只有一个名为tictactoe2D.compute2DMove()的端点方法,我在API资源管理器中测试过,并且工作正常。

现在我正在努力创建游戏的前端,并使用Google API JavaScript Client库与我的端点方法进行通信。我遵循了与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,中的代码,它添加了处理所有方块的click事件的功能,并且还与我的端点方法进行通信 -

$(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

我无法弄清楚为什么会发生这种情况,我该如何解决它。有人可以帮帮我吗? 非常感谢你。

1 个答案:

答案 0 :(得分:2)

在我观察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()而不是发出JSON-RPC请求。(请参阅Constructing REST requests using gapi.client.request)。构建REST请求可能既冗长又繁琐,但也很安全。