Отлов серверных ошибок {success:false}
Как отлавливать ответы сервера с ошибками {success:false} ? Например чтобы их выводить в консоли.
Как отлавливать глобально события exception у Прокси: http://docs.sencha.com/extjs/6.0/6.0...vent-exception ? Через эту штуку http://docs.sencha.com/extjs/6.0/6.0...p.domain.Store вроде не получается. Так как нет событий, связанных с ошибками в прокси... |
Для стора я переписывал onBatchException - помогло.
|
Цитата:
Может лучше домен свой сделать? Вот такой например:
Ext.define('Ext.app.domain.ProxyServer', {
extend: 'Ext.app.EventDomain',
singleton: true,
requires: [
'Ext.data.proxy.Server'
],
type: 'proxyServer',
constructor: function() {
var me = this;
me.callParent();
me.monitor(Ext.data.proxy.Server);
}
});
|
Нет, не глобально. Просто когда создавал свои сторы, при необходимости добавлял этот обработчик, а что он делал это уже зависело от конкретного случая.
Насчет домена я согласен, идея тоже интересная. Но я ими никогда не пользовался, тут еще надо осмыслить. А как вы его думаете использовать? Подписаться на exception в глобальном контроллере приложения? |
Цитата:
И да, потом подписываться в listen. |
Странно, что нигде ситуация success:false не обрабатывается.
|
В общем, попробую домен сделать. Потом расскажу что из этого вышло.
|
http://docs.sencha.com/extjs/6.0/6.0...ore-event-load
Там есть successful. В крайнем случае там есть объект операции, у которого есть http://docs.sencha.com/extjs/6.0/6.0...d-cfg-response Но не рекомендую, он приватный. |
Цитата:
|
Для таких вещей, как централизованная обработка событий и т.п. есть более адекватный вид транспорта, называется Ext Direct. Голые Ajax запросы всегда были хаковым хаком, им и останутся. Что в переводе на русский означает: всё вручную.
|
А для Ext Direct есть какие-то готовые серверные библиотеки для Node.js и PHP? Чтобы не писать с нуля реализацию протокола.
REST настолько прост, что особо и писать там нечего. С RPC не все так просто оказалось. |
Цитата:
Цитата:
|
Я правильно понимаю, что в RPC в качестве маршрута используется имя функции? В данном случае "Server.Demo.Todo.create" (взято из примера https://github.com/jurisv/extdirect....el/TodoItem.js)
То есть по сути, я могу взять любую реализацию RPC? |
Он на вебсокетах сделан? Или такой же медленный как REST?
|
Цитата:
Цитата:
В любом случае web sockets уже потеряли смысл, ибо грядет царствие HTTP/2.0 и чем скорее оно приидет, тем лучше будет всем. |
И как тогда глобально отлавливать ошибки, если я перейду с одного вида прокси на другое? Проблема остается нерешенной же.
|
Вам же надо было отлавливать все ошибки централизованно? Ext.direct.Manager на каждую ошибку стреляет событие exception, на себе и по шине Direct. Ловите контроллером и обрабатывайте, как нужно.
|
Начал с этой темой разбираться. Смотрю пример. Не смог найти определение переменной Server.API (строка 40)
https://github.com/jurisv/extdirect....Application.js где она определена??? |
хехе я правильно понял, что переменная Server.API определяется вот таким хитрым способом?
{
"path": "/directapi",
"remote": true
}
взято из файла https://github.com/jurisv/extdirect....extjs/app.json со строки 111 |
Цитата:
Есть и более интересные варианты с динамической загрузкой деклараций и созданием Providers по необходимости. В KitchenSink есть раздел с примерами на эту тему. Можно даже включать этот код в сборку приложения, клиенту в сущности важно лишь чтобы к моменту создания Provider объект с декларацией уже существовал. |
Есть что-нибудь посвежее чем этот модуль?
https://github.com/jurisv/nodejs.extdirect Он похоже не поддерживается. ЕС6 игнорирует. С путями проблемы, требует чтобы скрипт, генерирующий процесс и папка с API лежали на одном уровне. |
Можете поздравить. Прикрутил модуль https://github.com/jurisv/nodejs.extdirect к своему приложению.
Правда с путями к API проблема. Там нельзя указать абсолютный путь. Что с этим делать пока не знаю... Если разрабы ничего не будут делать, то придется этот модуль переписывать самому. В таком виде он не совсем удобоварим. |
Поздравляю. ;) Насколько я знаю, этот модуль вполне поддерживается, так что открывайте тикеты и задавайте вопросы. Автор модуля, Юрис, по-русски говорит отлично. ;)
|
Ура! Сделал домен и теперь можно глобально отлавливать ошибки из прокси!
|
Вот пример кода:
/**
* Глобальный отлов серверных ошибок (для таблиц grid).
*/
Ext.define('Pir.core.app.domain.PirReaderJson', {
extend: 'Ext.app.EventDomain',
singleton: true,
requires: [
'Pir.core.data.reader.Json'
],
type: 'pirReaderJson',
prefix: 'pirReaderJson.',
idMatchRe: /^\#/,
constructor: function() {
var me = this;
me.callParent();
me.monitor(Pir.core.data.reader.Json);
},
match: function(target, selector) {
var result = false;
//var alias = target.alias;
if (selector === '*') {
result = true;
}
// else if (this.idMatchRe.test(selector)) {
// result = target.getStoreId() === selector.substring(1);
// } else if (alias) {
// result = Ext.Array.indexOf(alias, this.prefix + selector) > -1;
// }
return result;
}
});
/**
* Этот класс создан для работы домена Pir.core.app.domain.PirReaderJson.
*/
Ext.define("Pir.core.data.reader.Json", {
extend: "Ext.data.reader.Json",
alias: "reader.pir-json",
getResponseData: function() {
var result = this.callParent(arguments);
if (result.ErrorCode != "1") {
this.fireEvent("pirerror", result.ErrorDescription, result);
}
return result;
}
});
/**
* The main application class. An instance of this class is created by app.js when it
* calls Ext.application(). This is the ideal place to handle application launch and
* initialization details.
*/
Ext.define('PirDesktopFirst.Application', {
extend: 'Ext.app.Application',
name: 'PirDesktopFirst',
controllers: ["Pir.core.controller.Root"],
stores: [
// TODO: add global / shared stores here
],
launch: function () {
Pir.Core.selectServer("first");
},
onAppUpdate: function () {
Ext.Msg.confirm('Application Update', 'This application has an update, reload?',
function (choice) {
if (choice === 'yes') {
window.location.reload();
}
}
);
}
});
Ext.define("Pir.core.controller.Root", {
extend: "Ext.app.Controller",
requires: ["Pir.core.app.domain.PirReaderJson"],
init: function() {
this.listen({
pirReaderJson: {
"*": {
pirerror: this.onPirReaderJsonEvent
}
}
});
},
onPirReaderJsonEvent: function(errorDescription, result) {
Ext.toast({
html: errorDescription,
title: 'Ошибка на сервере',
width: 400
});
}
});
|
Интересный пример, но я бы ловил ошибки на транспорте; когда данные уже доползли до reader, обычно бывает уже поздно пытаться что-то делать с запросом.
В Ext Direct есть механизм исключений, можно бросать их на сервере при обработке запросов и ловить на клиенте. |
А что значит ловить ошибки на транспорте?
|
Если речь идет (ловить на транспорте) до того, как данные превратятся в JSON, то данные будут ДВА РАЗА превращаться в JSON. Что не есть хорошо.
|
| Часовой пояс GMT +3, время: 07:00. |