2017-01-24 6 views
1

Я хотел бы получить сообщение об ошибке из прокси-сервера магазина.Получение сообщения об ошибке из Store Proxy

Моего магазин выглядит следующим образом:

Ext.define("MyStore", { 
    extend: "Ext.data.Store", 
    model: 'mymodel', 
    proxy: { 
     type: 'customrest', 
     paramsAsJson: true, 
     url: myUrl, 
     actionMethods: { 
      read: 'POST' 
     }, 
     reader: { 
      type: 'json', 
      record: 'result', 
      root: 'results' 
     } 
    }, 

    listeners: { 
     load: function (store, records, success) { 
      if (!success) { 

      }else { 
       //OK 
     } 
     } 
    } 
}); 

кажется, только дайте мне успеха является ложным, и никакой другой информации не находится под руку. Я знаю, что есть также сообщение об ошибке возвращается, потому что данные возвращаются выглядит следующим образом:

{успеха: ложь, сообщение: «бла-бла-бла«"}

там где я могу получить сообщение «сообщение»?

UPDATE:

Мой магазин называется так:

this.psstore = Ext.getStore("MyStore"); 

this.psstore.load({ 
    params: postBody, 
    callback: function (records, operation, success) { 

     if (success) { 
+0

Предоставьте свой код, который возвращает результаты (код или API, вызываемый Proxy.) Вам необходимо обработать это в ответ на этот API. \t Строка storeLoader общественности (/ * Титулы * /) { \t \t если (успешно) { \t \t \t "{успех: истинно}" \t \t} еще { \t \t \t «{успех: ложь, сообщение : «Что-то пошло не так»} « \t \t} \t} – Harshal

ответ

2

Проверьте ваш читатель messageProperty:

http://docs.sencha.com/extjs/4.0.7/#!/api/Ext.data.reader.Json-cfg-messageProperty

так в вашей конфигурации, вы должны иметь:

reader: { 
     type: 'json', 
     record: 'result', 
     root: 'results', 
     messageProperty: 'message' 
    } 

Вы тогда должны быть способный получить сообщение через свойство operation.exception (IIRC) в обратном вызове нагрузки. Это также параметр, переданный в событии onLoad (http://docs.sencha.com/extjs/4.0.7/#!/api/Ext.data.Store-event-load), поэтому вы также можете получить к нему доступ. Мы используем это на Ext 4 с помощью XML-ридера и в нашем обновлении до 6, чтобы он был безопасен в использовании.

+0

спасибо, что сработало –

1

Да, есть, но нет, вы не должны использовать его.

В вашем случае, в ExtJS до ExtJS 6, вы можете легко прочитать весь необработанный ответ от getStore().getProxy().getReader().rawData, если вы не установили keepRawData:false в определении читателя. Это поставляется с большим , но.

В 6.0 необработанные данные отбрасываются очень рано, если вы не используете keepRawData на считывателе. Причина, цитата из документов: Обратите внимание, что, начиная с Ext JS 6.0, поведение по умолчанию было изменено, чтобы не сохранять необработанные данные из-за высокого потенциала утечки памяти.

Из-за этого, я добавил переопределение на моем считывателю ExtJS 6.0.1:

Ext.define("MyApp.override.JsonReader", { 
    override:"Ext.data.reader.Json", 
    /** 
    * Make additional processing available on the raw response. 
    */ 
    processRawResponse:null, 
    getResponseData:function(response) { 
     if(this.processRawResponse) this.processRawResponse(response); 
     me.callParent(arguments); 
    } 
}); 

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

proxy: { 
    type: 'ajax', 
    groupParam: false, 
    startParam:false, 
    limitParam:false, 
    pageParam:false, 
    sortParam:false, 
    url: '../api/AdminPanel/ACLRules', 
    headers: { 
     Accept: 'application/json' 
    }, 
    reader: { 
     type: 'json', 
     rootProperty: 'data', 
     processRawResponse:function(response) { 
      var responseText = Ext.decode(response.responseText, true); 
      if(responseText && responseText.message) { 
       Ext.Msg.alert('ERROR',responseText.message); 
      } 

Вы можете попробовать, работает ли это в ExtJS 4; from the source code, it seems so. В противном случае должны потребоваться только незначительные изменения.

Если ваши сообщения об ошибках поступают в одно и то же свойство каждый раз и каждый раз им нужна одинаковая обработка, вы также можете обрабатывать их по всему миру, непосредственно из переопределения, например. если вы получаете массив информации отладки:

getResponseData:function(response) { 
    if(this.processRawResponse) this.processRawResponse(response); 
    var debugList = Ext.getCmp("debugList"), 
     shorten = function(tex) { 
      return tex.substring(0,500).replace(/(\r\n|\r|\n)/g,"<br>"); 
     }, 
     returned = ""; 
    try { 
     returned = response.responseText; 
     var decodedData = Ext.decode(returned); 
     if(decodedData.Debug) this.rawDebugData = decodedData.Debug; 
     return decodedData; 
    } catch (ex) { 
     var caption = "Decoding error", 
      message = "The server has returned malformed JSON.", 
      box = Ext.create('Ext.window.MessageBox',{}); 
     try { 
      var jsonStart = Math.min(returned.indexOf('['), returned.indexOf('{')); 
      if(jsonStart>0) { 
       message = (message + "\n" + returned.substring(0,jsonStart)); 
       returned = returned.substring(jsonStart); 
      } 
      else { 
       message = (message + "\n" + returned); 
      } 
     } catch (e) { 
     } 
     if(!debugList) box.alert(caption,shorten(message)); 
     if(debugList) debugList.setValue(debugList.getValue()+caption+': '+message+'\n'); 
     return Ext.decode(returned, true) || {}; 
    } 
}, 
+0

wow thanks. Я понятия не имел, что это так сложно. Я думаю о просто переключении на простой вызов Ajax вместо использования прокси. Прокси кажется скорее головной болью, чем они стоят. –

+0

В основном, что такое использование прокси? Имеет ли он преимущества при использовании небольших гранулированных операций типа CRUD? Но для простого дампа данных в таблице ... тогда достаточно позвонить AJAX и быть более правильным? –

+0

IMO, простое переопределение для читателя не сложно. Мое сложное переопределение внизу - это то, что я пытаюсь обрабатывать ответы, содержащие части, не относящиеся к JSON. Не спрашивайте, что именно происходит там, я уже забыл ;-) Прокси используются, если вам нужен магазин со всеми CRUD-операциями. С другой стороны, самым большим преимуществом простого вызова Ajax было бы то, что вы можете связать данные, чтобы заполнить сразу несколько магазинов, если хотите. Это уменьшит количество вызовов на сервер. – Alexander

Смежные вопросы