Канал Google AppEngine открыт, клиент получает ответы, но socket.onmessage не вызывается

У меня есть веб-страница, которую я хочу использовать API канала Google App Engine с. У меня есть токен, созданный с помощью внешней библиотеки, которая загружается в этот очень, очень простой javascript.

<html lang="en">
<body>
    <script src="jquery-1.6.3.min.js" ></script>
    <script type="text/javascript" src="/_ah/channel/jsapi"></script>
    <script type="text/javascript">
        var token, channel, socket;
        var onOpened = function() {
            document.body.innerHTML += "<br>Open!";
        };
        var onMessage = function(msg) {
            document.body.innerHTML += "<br>Message: " + msg;
        };
        var onChannelError = function(error) {
            document.body.innerHTML += "<br>Error! :'(" 
        };
        var onClose = function(e) {
            document.body.innerHTML += "<br>Close :(";
        };
        var handler = {
            onopen: onOpened,
            onmessage: onMessage,
            onerror: onChannelError,
            onclose: onClose
        };
        var openChannel = function(t) {
            token = t;
            channel = new goog.appengine.Channel(token);
            socket = channel.open(handler);
        };
    </script>
</body>
</html>

Когда я запускаю этот код (вызывая openChannel с моим токеном канала), вызывается метод onOpen (поэтому HTML изменяется и не говорит «Открыть!». Мой сокет var выглядит следующим образом:

rf {readyState: 1, cc: Array[0], onopen: function, onmessage: function, onerror: function…}

И когда я смотрю на сетевой журнал ChromeInspector, после того, как канал открыт, я вижу, что браузер теперь успешно опрашивает (не уверен, что это правильный термин) talkgadget.google.com. В ответ он получает то, что выглядит совершенно нормально. Я получаю много цифр, скобок и ["noop"] в большинстве ответов. И если я вручную запускаю уведомление на сервере, мой клиент получает информацию об уведомлении в своем запросе! Но мой socket.onmessage до сих пор не вызывается!

Вот скриншот моей сетевой вкладки в то время. Длинный опрос мне кажется успешным

Вызов socket.onmessage({}) вручную изменяет DOM на «Message: [object Object]», поэтому мой обработчик не кажется проблемой. И на всякий случай там есть точка останова. Если я вызываю socket.close(), моя функция onClose также вызывается правильно.

Это сводит меня с ума, поэтому большое спасибо за любую помощь или совет, который вы можете мне дать!


person thefistopher    schedule 09.06.2015    source источник
comment
Я не могу создать канал. не могли бы вы помочь с этим stackoverflow.com/questions/34332222/   -  person Sunil Garg    schedule 17.12.2015


Ответы (2)


Мы также использовали это и столкнулись с той же проблемой, этот обходной путь, похоже, отлично работает для нас, назначая onmessage после создания сокета:

channel = new goog.appengine.Channel(token);
socket = channel.open();
socket.onmessage = onMessage;
person omerio    schedule 12.06.2015
comment
Хм, к сожалению, это ничего не делает для меня. :/ Любые другие фрагменты кода, которые, по вашему мнению, могли бы помочь? - person thefistopher; 12.06.2015
comment
Я могу предложить только две вещи: похоже, у нас есть код javascript канала внутри setTimeout(function(){}, 500); так что это немного задерживается, попробуйте обернуть свою функцию тайм-аута или готовности документа. Во-вторых, дважды проверьте, что токен на сервере совпадает с токеном на клиенте, если вы можете распечатать токен на сервере в журналах и выполнить console.log для токена в Javascript. Дайте мне знать, если что-то из этого поможет - person omerio; 12.06.2015
comment
На самом деле, как ни странно, ваш код работает, если я избавлюсь от обработчика, и это просто channel.open(). Странно.. ... Но это работает! Ура! Спасибо. Надеюсь гугл это исправит - person thefistopher; 12.06.2015

Я говорил с Google о проблеме, с которой я столкнулся. По их словам, проблемы возникли из-за того, что в моем приложении я модифицировал DOM всякий раз, когда взаимодействовал с каналом. По какой-то причине это привело к тому, что гаджет iframe, вставленный каналом, молча сломался. Итак, я удалил манипуляцию с DOM (т.е. innerHTML += "Opened Channel"), и канал заработал.

person thefistopher    schedule 15.07.2015