2

チャンネルを開くときに問題が発生しました。私はサーバー側でこれを持っています:

   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 でこれらのエラーを追跡する方法はありますか? エラーがどこにあるかを推測するよりも効果的な何か。

4

2 に答える 2

3

私はこれと同じ問題を抱えていました。ローカルホストでは問題なく動作しましたが、アップロードすると動作しませんでした。トークンが常に正しくフォーマットされているとは限らないようで、それらをトリミングする必要があります。

したがって、次のアラートは「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);
});

しかし、それは完全に機能し、チャネルを開きます!

于 2012-09-03T07:39:19.867 に答える
1

デバッグには、Firebug または Chrome デバッガーを使用します。Javascript に次の行を追加することで、メッセージをコンソールに記録できます。

window.console.log("Message")

「token」で取得した値が実際に正しいトークンであることを再確認してください。

于 2012-07-19T19:38:36.260 に答える