【问题标题】:Channel Google App Engine channel.open() does not work通道 Google App Engine channel.open() 不起作用
【发布时间】:2012-07-19 00:04:46
【问题描述】:

打开频道时出现问题。 我在服务器端有这个:

   def get(self):
        user = users.get_current_user()
        if not user:
            self.redirect(users.create_login_url(self.request.uri))
            return
        channel_id=str(str(random.randint(0,1000)))
        token = channel.create_channel(channel_id)
        template_values = {
                           'token': token,
                           'me': user.user_id()
                           }

        logger.debug("Token: %s user:%s %s %s" % (token,user.user_id(),user.nickname(),user.email()))
        self.response.out.write(template.render('templates/index.html', template_values))

这个在 HTML (templates/index.html)

<html>
<head>
  <script type="text/javascript" src="/_ah/channel/jsapi"></script>
</head>
<body>
    {{ token }}
    <script>alert("a0");
        var token = {{ token }};
        alert("a1");
        var channel = new goog.appengine.Channel(token);
        alert("a2");
        var socket = channel.open();
        alert("a3");


        socket.onopen = function(){
            alert("open");
        };

        socket.onmessage = function(m){
            var data = $.parseJSON(m.data);
            alert(data)
        };
        socket.onerror =  function(err){
            alert("Error => "+err.description);
        };
        socket.onclose =  function(){
            alert("channel closed");
        };
  </script>
</body>
</html>

我发出警报以查看是否一切正常,但 a0 a1 a2 被提出,而 a3 没有。 问题出在哪里? 为什么 channel.open() 不起作用?

PS:有没有办法在 javascript 中跟踪这些错误?比猜测错误在哪里更有效的方法。

【问题讨论】:

  • Firefox 有 Firebug,或者您可以使用 Chrome、Opera 等的内置 Javascript 调试器。大多数浏览器中还有一个显示错误的 Javascript 控制台。
  • 我也这么认为,但我也没有将“打开”视为警报。所以通道似乎没有打开。我实际上是在尝试获取 /_ah/channel/connected/ 数据,但我并不真正了解它是如何工作的
  • 您使用的是 Google App Engine 文档吗?
  • 为了什么?对于连接/断开连接?我正在读它。我添加了这个- url: /_ah/channel/connected/.* script: handlers_connect.app,这导致了这个类import webapp2 import logging # create logger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) class Channel(webapp2.RequestHandler): def post(self): client_id = self.request.get('from') logger.debug("client id %s" % client_id) return app = webapp2.WSGIApplication([('/.*', Channel)], debug=True),但到目前为止还没有。

标签: javascript python google-app-engine channel-api


【解决方案1】:

我遇到了同样的问题。它在本地主机上运行良好,但在我上传后无法正常工作。似乎标记并不总是开始正确格式化,您需要修剪它们。

因此以下警报带有“1”,但随后崩溃:

if(user != null)
{
    $.get("tutorial",{channelKey:userId} ,function(data) {alert(data); token = data;
    alert(userId);
    channel = new goog.appengine.Channel(data);
    alert(1);
    socket = channel.open();
    alert(2);
    socket.onopen = onOpened;
    alert(3);
    socket.onmessage = onMessage;
    alert(4);
    socket.onerror = onError;
    alert(5);
    socket.onclose = onClose;
    alert(6);
});

如果您将其更改为:

if(user != null)
{
    $.get("tutorial",{channelKey:userId} ,function(data) {alert(data); token = data;
    alert(userId);
    channel = new goog.appengine.Channel(data.trim());
    alert(1);
    socket = channel.open();
    alert(2);
    socket.onopen = onOpened;
    alert(3);
    socket.onmessage = onMessage;
    alert(4);
    socket.onerror = onError;
    alert(5);
    socket.onclose = onClose;
    alert(6);
});

但是,它运行良好,打开了通道!

【讨论】:

  • 太棒了!也解决了我的问题。
【解决方案2】:

使用 Firebug 或 Chrome 调试器进行调试。您可以通过在 Javascript 中添加行来将消息记录到控制台:

window.console.log("Message")

仔细检查您为“令牌”获得的值确实是正确的令牌。

【讨论】:

  • 实际上的问题是我错过了 {{ token }} 周围的 ' ' 但即使这样,onopen 的功能也没有提高。
  • 对此我不确定,但可能会错过回调,因为浏览器正在等待您单击其他断言之一。
  • 甚至在 onOpened 内部的警报未引发之前删除警报。每次刷新页面时都会更改频道(令牌)是否正常?
  • 我会说“不,这不正常”,就像你不应该那样做。但是,是的,在您的情况下这是预期的,因为在您的 get() 处理程序中,您会在每个请求上创建一个新令牌。
  • 另外,验证 channel.open() 是否返回一个有效的套接字对象,这可能解释了为什么你的 onopen() 没有被调用。