在Chrome扩展中使用Google App Engine的通道

3 投票
1 回答
1620 浏览
提问于 2025-04-17 07:06

这里是扩展程序中运行的代码,位于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;

}

它和一个本地服务器的脚本(用Python写的)进行交互,这个脚本会创建一个频道并返回一个令牌。然后,这个令牌会用来在客户端创建频道对象。

但是,我从聚合响应中得到的是:

channel-354645736-1234 * 错误:无效令牌 401 * 关闭

当我在扩展程序的范围之外(不使用ajax建立连接)进行操作时,一切都很顺利。

我哪里出错了呢?

1 个回答

2

根据你的评论,我看到你在本地开发环境中测试频道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测试服务器的端口)

另外,你在xhr.open中发送的URL必须在你的清单的“权限”部分中列出,在我的情况下是

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

你本地appengine测试服务器生成的令牌和线上系统的令牌是不同的,所以这两者不能混用。

撰写回答