一千萬個為什麽

搜索

在Chrome擴展程序中使用頻道Google應用引擎

這是在back.html中運行的代碼,在background.html中。

function onLoad()
{

    var path="http://localhost:8082/index.htm?key=1234";
    xhr.open('get', path, false);
    xhr.send();
    token=xhr.responseText;
    caughtMsg=token+" *** ";
    var channel = new goog.appengine.Channel(token);
    var handler = {
      'onopen': function(){caughtMsg+=" *** open";},
      'onmessage': onMessage,
      'onerror': function(e){caughtMsg+=" *** err "+e.description+" "+e.code},
      'onclose': function(){caughtMsg+=" *** close";}
    };
    var socket = channel.open(handler);
    socket.onmessage = onMessage;

}

它與localhost服務器腳本(在python中)交互,該腳本創建一個通道並返回一個令牌。然後令牌用於在客戶端創建通道對象。 相反,我從聚合反應得到的是:

channel-354645736-1234 *錯誤無效+令牌401 * 關閉

當我在擴展範圍之外(不使用ajax建立連接)時,它就像一個魅力。

我哪裏誤入歧途?

最佳答案

正如我從您的評論中看到的那樣,您在本地開發系統上測試通道API時遇到了問題。

當我下載channel.js(而不是使用http://*.appspot.com/_ah/channel/jsapi)並在後臺腳本上使用本地副本時,它對我有用

<script type="text/javascript" src="/lib/channel.js"></script>

在channel.js中,更改行定義

goog.appengine.DevSocket.BASE_URL = "http://localhost:8080/_ah/channel/";

代表您的本地環境(appengine testserver的端口)

另外,在我的情況下,您發送xhr.open的URL必須在您的清單“權限”部分中

"permissions":
  [
    ...,
    "http://localhost:8080/"
  ]

您當地的appengine testserver生成的令牌與生命系統中的令牌不同,因此不可能將兩者混合使用。

轉載註明原文: 在Chrome擴展程序中使用頻道Google應用引擎