【问题标题】:Why does Google App Engine Channel API (jsapi) fail to load in a Chrome extension?为什么 Google App Engine Channel API (jsapi) 无法在 Chrome 扩展程序中加载?
【发布时间】:2011-11-01 01:35:07
【问题描述】:

我在 Chrome 扩展程序中使用 Channel API。

Google App Engine Channel API Javascript Reference (Python) 页面上说

在任何 JavaScript 代码之前在您的 html 页面中包含以下内容 那是指它:

<script type="text/javascript" src="/_ah/channel/jsapi"></script>

所以,我把它放在我的 options.html 文件的标题中:

<html>
<head>
    <title>Extension Options</title>
    <script type="text/javascript" src="/_ah/channel/jsapi"></script>
</head>

但 Chrome 会抛出 jsapiFailed to load resource 错误。我做错了什么?

更新

根据 Moishe 的回答,我更新了对 jsapi 的调用,如下所示:

<head>
    <title>Extension Options</title>
    <!-- this does not work because it is local
    <script type="text/javascript" src="/_ah/channel/jsapi"></script>
    -->
    <script type="text/javascript" src="https://talkgadget.google.com/talkgadget/channel.js"></script>
</head>

更新

我添加了onopen 和其他属性。现在我收到onopen 警报,但我没有收到evt.data 警报。我做错了什么?

<html>
<head>
    <title>Extension Options</title>
    <!-- this does not work because it is local url
    <script type="text/javascript" src="/_ah/channel/jsapi"></script>
    -->
    <script type="text/javascript" src="https://talkgadget.google.com/talkgadget/channel.js"></script>
</head>

<body>
<p>Enter your gmail address:</p>

<textarea id="getEmail" style="margin-bottom: 4px; width: 250px; height: 20px">
</textarea><br />

<button id="save">Save</button>
<!--<button id="save">Clear</button>-->

<script>
document.getElementById("getEmail").placeholder = "your gmail address" ;

//save entered gmail address
document.getElementById("save").addEventListener
(
    "click", 
    function ()
    {
        var userEmail = document.getElementById("getEmail").value;
        var formData = new FormData();
        formData.append("extension_user", userEmail);
        alert("after formData.append")

        var channel;
        var socket;
        var handler = 
        {
            onopen: function () { alert("onopen") },
            onerror: function () { alert("onerror") },
            onclose: function () { alert("onclose") },
            onmessage: 
            function (evt)
            {
                //evt.data will be what the server sends in channel.send_message
                console.log("evt.data received from authhandler: " + evt.data);
                alert("evt.data is: " + evt.data)
            }
        };    

        var xhr = new XMLHttpRequest();
        //changed to lowercase
        xhr.onreadystatechange = function()
        {
            //alert("xhr.onReadyStateChange")
            //error handling etc not included
            if (xhr.readyState == 4 && xhr.status == 200)
            {
                token = xhr.responseText;
                alert("token: " + token)
                channel = new goog.appengine.Channel(token);
                socket = channel.open(handler);
            }
        };
        xhr.open("POST", "http://ting-1.appspot.com/authsender", true);
        xhr.send(formData);
        console.log("formData sent to authsender: " + formData);
    }, false
)



</script>
</body>
</html>

【问题讨论】:

  • 这是使用 dev_appserver 还是在生产中?您能否提供有关 Chrome 开发工具中“网络”标签的任何详细信息?
  • 这是在生产中。首先,“网络”选项卡中没有任何内容;然后我按照指示重新加载页面,我看到 2 个项目:options.html 和 jsapi:名称:options.html;方法:获取;状态:(来自缓存);类型:文本/html;大小:(来自缓存);时间:3ms 和jsapi /_ah/channel; GET, (failed); undefined; 30B; 5ms 谢谢!
  • 你介意告诉我你的appid吗?如果您尝试直接导航到“your-app-id.appspot.com/_ah/channel/jsapi”会发生什么?
  • 确定它是 ting-1,所以当我粘贴上面的应用程序 ID 时,它会重定向到 talkgadget.google.com/talkgadget/channel.js,页面上有一堆代码
  • 如果它直接在浏览器中运行,那么您的应用对 /_ah/channel/jsapi 的“options.html”请求有何不同? options.html 是否托管在 ting-1.appspot.com 上? (当我尝试加载它时,我得到了 404)

标签: google-app-engine google-chrome google-chrome-extension


【解决方案1】:

在 chrome 扩展程序中,您需要直接指定 Channel javascript (https://talkgadget.google.com/talkgadget/channel.js) 的路径。 /_ah/channel/jsapi 的请求不能被任何东西重定向,因为试图加载它的文件是本地的。

【讨论】:

  • 对不起,关于标题我应该提到“Chrome 扩展程序”。现在我没有收到原始错误,但我收到了另一个错误,我不确定它是否与我的代码有关:Uncaught TypeError: Property 'onopen' of object [object Object] is not a function 位于 channel.js 的第 77 行。这与我的function (evt) 的问题有关吗?再次感谢。
  • 我不知道它是否相关,但网络选项卡显示 GET 200-OK for bind 235.talkgadget.google.com/talkgadget/dch
  • 您需要在处理程序中指定一个 onopen 回调。
  • 谢谢。我添加了 onopen 和其他属性,我看到了 onopen 的警报,但我没有看到消息的警报。我用最新的代码更新了这个问题。我错过了什么?再次感谢。
  • 确保使用与创建令牌相同的客户端 ID 调用 send_message。服务器端的一些日志记录将对此有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多