dojo.store.JsonRest отслеживание ошибок

122 views
Skip to first unread message

Pavel Trizno

unread,
May 17, 2012, 9:01:04 AM5/17/12
to RU DojoToolkit JS Framework
При использование dojo.store.JsonRest есть ли какой то механизм для
отслеживания кодов ответа сервера и получения тела ответа (сообщения
об ошибки)?

Eugene Lazutkin

unread,
May 18, 2012, 1:21:52 PM5/18/12
to ru-dojo-js...@googlegroups.com
Я обычно для этого пользую дебаггер (Firefox w/ Firebug, Chrome debugger). Если по каким-то причинам я должен отлаживаться на IE6-IE8, то помогает Fiddler или HttpWatch. Во всех этих продуктах можно инспектировать весь I/O, включая проверку статус кодов, заголовков как запроса так и ответа, и разумеется тело самого ответа.

Pavel Trizno

unread,
May 18, 2012, 6:34:33 PM5/18/12
to ru-dojo-js...@googlegroups.com
Вы меня не так поняли. Мне надо повесить каллбек на приходящие коды ответа сервера отличные от 200.

Ильдар Гильфанов

unread,
May 21, 2012, 4:20:34 AM5/21/12
to ru-dojo-js...@googlegroups.com
как вариант: http://pastie.org/3943593

а еще совет, не используйте dojox.data.JsonRestStore, ничего крутого в нем нет.

используйте добрые: dojo.xhrPost, dojo.xhrGet. И обрабатывайте любые
ошибки в методе handle.

19.05.12, Pavel Trizno<pavel....@googlemail.com> написал(а):


> Вы меня не так поняли. Мне надо повесить каллбек на приходящие коды ответа
> сервера отличные от 200.
>

> --
> Вы получили это сообщение, поскольку подписаны на группу RU DojoToolkit JS
> Framework.
>
> Просмотреть это обсуждение в Сети можно по адресу
> https://groups.google.com/d/msg/ru-dojo-js-framework/-/uIOMMR3gWtgJ.
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу
> ru-dojo-js...@googlegroups.com.
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу
> ru-dojo-js-frame...@googlegroups.com.
> О дополнительных функциях можно узнать в группе по адресу
> http://groups.google.com/group/ru-dojo-js-framework?hl=ru.
>
>

Ильдар Гильфанов

unread,
May 21, 2012, 4:35:38 AM5/21/12
to ru-dojo-js...@googlegroups.com
см. Example 9 http://dojotoolkit.org/reference-guide/1.7/dojo/xhrGet.html#dojo-xhrget


вот так, обрабатываю я: http://pastie.org/3943643


21.05.12, Ильдар Гильфанов<igil...@gmail.com> написал(а):

Andriy Izenytskyy

unread,
May 21, 2012, 4:44:09 AM5/21/12
to ru-dojo-js...@googlegroups.com
По моему Павел использовал не  dojox.data.JsonRestStore а dojo.store.JsonRest а там есть метод get которий не обрабатывает ошибок вообще.
get: function(id, options){
var headers = options || {};
headers.Accept = "application/javascript, application/json";
return dojo.xhrGet({
url:this.target + id,
handleAs: "json",
headers: headers
});
},
думаю можно екстенднуть dojo.store.JsonRest и реализовать свой метод get например так:
get: function(id, options){
var headers = options || {};
headers.Accept = "application/javascript, application/json";
return dojo.xhrGet({
url:this.target + id,
handleAs: "json",
headers: headers,
                        error: function(err, ioArgs){
                                ......
return err; 
});
},

2012/5/21 Ильдар Гильфанов <igil...@gmail.com>

Pavel Trizno

unread,
May 21, 2012, 7:57:41 AM5/21/12
to ru-dojo-js...@googlegroups.com
Я использую dojo/store/JsonRest в связке с dgrid. Т.к. болшая часть приложения это работа с гридом хочется иметь единый интерфейс для работы с данынми а не пладить костыли на xhrGet/xhrPost. Тем более JsonRest это обвертка над xhrGet/xhrPost. По ссылке что вы дали работа с именно с dojox.data.JsonRest эо мне не подходит.

Сам склоняюсь уже к тому чтобы просто переопределить через dojo.declare методы get, put, query, remove у dojo/store/JsonRest. По сути все сведется к добавлению пресловутого handle в xhr. Я просто думал что есть какой то более элегантный способ.  

понедельник, 21 мая 2012 г., 12:20:34 UTC+4 пользователь Ильдар Гильфанов написал:
как вариант: http://pastie.org/3943593

а еще совет, не используйте dojox.data.JsonRestStore, ничего крутого в нем нет.

используйте добрые: dojo.xhrPost, dojo.xhrGet. И обрабатывайте любые
ошибки в методе handle.

19.05.12, Pavel Trizno<pavel.trizno@googlemail.com> написал(а):


> Вы меня не так поняли. Мне надо повесить каллбек на приходящие коды ответа
> сервера отличные от 200.
>
> --
> Вы получили это сообщение, поскольку подписаны на группу RU DojoToolkit JS
> Framework.
>
> Просмотреть это обсуждение в Сети можно по адресу
> https://groups.google.com/d/msg/ru-dojo-js-framework/-/uIOMMR3gWtgJ.
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу

> ru-dojo-js-framework@googlegroups.com.


> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу

> ru-dojo-js-framework+unsub...@googlegroups.com.

Andriy Izenytskyy

unread,
May 21, 2012, 11:14:55 AM5/21/12
to ru-dojo-js...@googlegroups.com
Для работы  с гридами лучше всего подходит dojox.data.QueryReadStore, так как там есть возможность использовать серверный пейджинг.
Конечно, если вам нужно загружать не большое количество даных то подойдут и другие.

2012/5/21 Pavel Trizno <pavel....@googlemail.com>
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msg/ru-dojo-js-framework/-/1QZdCQMA46kJ.

Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу ru-dojo-js...@googlegroups.com.
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу ru-dojo-js-frame...@googlegroups.com.

Pavel Trizno

unread,
May 21, 2012, 12:07:33 PM5/21/12
to ru-dojo-js...@googlegroups.com
Серверный пейджин реализуется и в dojo/store/JsonRest. Просто он реазизуется через специальный заголовок хттп Content-Range . А в dgrid есть отличный экстеншет https://github.com/SitePen/dgrid/blob/master/extensions/Pagination.js котрый добавляет поодержку пегинации для dgrid в том числе и для sotore JsonRest.

понедельник, 21 мая 2012 г., 19:14:55 UTC+4 пользователь aizen написал:
Для работы  с гридами лучше всего подходит dojox.data.QueryReadStore, так как там есть возможность использовать серверный пейджинг.
Конечно, если вам нужно загружать не большое количество даных то подойдут и другие.

2012/5/21 Pavel Trizno <pavel....@googlemail.com>
Я использую dojo/store/JsonRest в связке с dgrid. Т.к. болшая часть приложения это работа с гридом хочется иметь единый интерфейс для работы с данынми а не пладить костыли на xhrGet/xhrPost. Тем более JsonRest это обвертка над xhrGet/xhrPost. По ссылке что вы дали работа с именно с dojox.data.JsonRest эо мне не подходит.

Сам склоняюсь уже к тому чтобы просто переопределить через dojo.declare методы get, put, query, remove у dojo/store/JsonRest. По сути все сведется к добавлению пресловутого handle в xhr. Я просто думал что есть какой то более элегантный способ.  

понедельник, 21 мая 2012 г., 12:20:34 UTC+4 пользователь Ильдар Гильфанов написал:
как вариант: http://pastie.org/3943593

а еще совет, не используйте dojox.data.JsonRestStore, ничего крутого в нем нет.

используйте добрые: dojo.xhrPost, dojo.xhrGet. И обрабатывайте любые
ошибки в методе handle.

19.05.12, Pavel Trizno<pavel.trizno@googlemail.com> написал(а):
> Вы меня не так поняли. Мне надо повесить каллбек на приходящие коды ответа
> сервера отличные от 200.
>
> --
> Вы получили это сообщение, поскольку подписаны на группу RU DojoToolkit JS
> Framework.
>
> Просмотреть это обсуждение в Сети можно по адресу
> https://groups.google.com/d/msg/ru-dojo-js-framework/-/uIOMMR3gWtgJ.
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу
> ru-dojo-js-framework@googlegroups.com.
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу


> О дополнительных функциях можно узнать в группе по адресу
> http://groups.google.com/group/ru-dojo-js-framework?hl=ru.
>
>

--
Вы получили это сообщение, поскольку подписаны на группу RU DojoToolkit JS Framework.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msg/ru-dojo-js-framework/-/1QZdCQMA46kJ.

Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу ru-dojo-js-framework@googlegroups.com.

Andriy Izenytskyy

unread,
May 21, 2012, 4:57:56 PM5/21/12
to ru-dojo-js...@googlegroups.com
C dgrid никогда не работал....что-то новенькое, нужно попробовать.

2012/5/21 Pavel Trizno <pavel....@googlemail.com>
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msg/ru-dojo-js-framework/-/Ae--I09A9w4J.

Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу ru-dojo-js...@googlegroups.com.
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу ru-dojo-js-frame...@googlegroups.com.

Pavel Trizno

unread,
May 22, 2012, 2:24:58 AM5/22/12
to ru-dojo-js...@googlegroups.com
Для затравки можно посмотреть таблицу сравнительную с остальными известными плагинами/экстеншинами гридов http://dojofoundation.org/packages/dgrid/

вторник, 22 мая 2012 г., 0:57:56 UTC+4 пользователь aizen написал:
2012/5/21 Pavel Trizno <pavel....@googlemail.com>

2012/5/21 Pavel Trizno <pavel....@googlemail.com>
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу ru-dojo-js-framework+unsubscrib...@googlegroups.com.

О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/ru-dojo-js-framework?hl=ru.

--
Вы получили это сообщение, поскольку подписаны на группу RU DojoToolkit JS Framework.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msg/ru-dojo-js-framework/-/Ae--I09A9w4J.

Eugene Lazutkin

unread,
May 22, 2012, 11:27:36 PM5/22/12
to ru-dojo-js...@googlegroups.com
Теперь вроде понял. Увы, похоже что dojo.store пропустил обработку ошибок.

Я обычно для своего кода использую функции, которые добавляют дополнительную функциональность к вводу/выводу и затем вызывают необходимые базовые функции. Например, они могут добавлять "магический" заголовок к запросу, или подставлять какие-то параметры, или обрабатывать ошибкиб или инспектировать успешный ответ, и преобразовывать его в ошибку (бывают серверы, который возвращают ошибку используя XML или JSON и используя код возврата ... 200). Пример: если сервер вернул 401, то запомним где мы были и уйдём на логин, и после успешного логина вернёмся обратно. Другой пример будет показ сообщения об ошибке в каком-либо формализованном виде на странцице, или диалогом.

Когда моя собственная функция не помогает (например потому что части приложения пользуют dojo.xhrGet() напрямую), я просто заменяю dojo.xhrGet() на свою функцию глобально. Эта замена симулирует dojo.xhrGet() (или что я там заменял) добавляя доплнительные параметры как описано вверху и вызывает оригинальную dojo.xhrGet() для реальной работы.

Чего и как можно добавить и/или изменить подробно написано в доках:


Есть и другой, менее "кровавый" вариант: используй IO топики. Вся dojo машинерия ввода/вывода постит определённые топики по ряду событий. С помощью этих топиков можно делать кучу разных вещей по простому. Например, если мы хотим чтоб пользователь не мог изменять поля в формах во время обмена с сервером (любого обмена), то мы слушаем dojo/io/start и dojo/io/stop --- по первому мы запрещаем редактирование полей форм и показываем индикатор активного обмена с сервером, по второму мы выключаем индикатор и разрешаем редактирование. Всё это будет работать корректно даже в присутствии нескольких параллельных запросов.

Точно так же есть топики для начала любого обмена, его конца, его удачного завершения, и ошибки. Последнее скорее всего то что надо. Детали всего этого можно прочитать в доках:


Надеюсь, что эта информация окажется полезной.

Pavel Trizno

unread,
May 23, 2012, 4:56:41 AM5/23/12
to ru-dojo-js...@googlegroups.com
Спасибо, Евгений. Про топики знал а вот про то что есть топики ввода/вывода был не в курсе. А по какой причине ioPublish по умолчанию отключен вы не подскажите? 

Eugene Lazutkin

unread,
May 23, 2012, 10:41:21 AM5/23/12
to ru-dojo-js...@googlegroups.com
Тайна сия велика есть. Я помню их добавление, но совершенно не помню аргументации этой детали. Скорее всего Джеймс хотел чтоб соблюдалась полная совместимость с предыдущими версиями, а может боялся возможного падения производительности. Но придумать реалистичный сценарий ломания старого кода или потребления существенно большего объёма ресурсов из за автоматической публикации топиков я просто не могу. Надо не забыть поправить это в 2.0.

Ильдар Гильфанов

unread,
Apr 20, 2014, 2:53:06 PM4/20/14
to ru-dojo-js...@googlegroups.com, pavel....@googlemail.com
интересно можно ли решить эту задачку с помощью АОП, например с помощью dojo/aspect ? 

следующая конструкция работает до отправки запроса и только при удачных http-статусов:

aspect.after(dojo, "xhr", function(deferred){
  // returning a value replaces the return value

//
до отправки запроса

 return deferred.then(function(response){ return dojo.fromJson(response); //при удачных http-статусов }); }); var parsedResponse = dojo.xhr("GET", {...});




четверг, 17 мая 2012 г., 17:01:04 UTC+4 пользователь Pavel Trizno написал:

Ильдар Гильфанов

unread,
Apr 21, 2014, 2:25:31 PM4/21/14
to ru-dojo-js...@googlegroups.com, pavel....@googlemail.com

После долгих поисков, нашел следующую конструкцию (исходный код):

aspect.around(require.modules['dojo/request/xhr'], 'result', function(originalXhr){
    return function(url, options, returnDeferred){

        var dfd = new Deferred();

        // Logic before making the xhr call

        originalXhr(url, options, returnDeferred)
            .then(function(response) {

                // Logic handling the response but before resolving the deferred.
                dfd.resolve(vm);
                // Logic after resolving the deferred.

            }, function(err){
                // error handling?
                dfd.reject(msgs);

            }, function(update) {
                dfd.progress(update);
        });

        return dfd;
    };
});


 В итоге не работает (на dojo 1.9.3.),  версия dojo в исходном коде осталась загадкой.

 


воскресенье, 20 апреля 2014 г., 22:53:06 UTC+4 пользователь Ильдар Гильфанов написал:

Ильдар Гильфанов

unread,
Apr 21, 2014, 4:11:33 PM4/21/14
to ru-dojo-js...@googlegroups.com, pavel....@googlemail.com

   // разобрался. следующий вариант работает для метода GET :  

   var store = new JsonRest({
           target: "book/index/"
   });
                    
    aspect.after(store, "get", function(originalGet){
             return function(id, options){
                               
                      var deferred = originalGet(id, options);
                                                                 
                       deferred.then(function(response){
                                      return dojo.fromJson(response);       //здесь надо проверить еще
                       }, function(err){                                   
                                       console.log(err.response.status);    // http - статус                     
                       });   
                                                               
                       return deferred;                               
               }
       });
     
       store.get('78').then(function(item){
            console.log(item);
       });

  Замечания:

  1. dojo/store/JsonRest  до сих пор использует устаревший модуль dojo/_base/xhr, альтернативное store использовать не могу так, как использую dgrid;
 
  2. dojo/aspect не может накладывать события непосредственно в загруженный модуль, т.е. до создания объекта, например new JsonRest;

 
Reply all
Reply to author
Forward
0 new messages