Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Отлов серверных ошибок {success:false} (https://javascript.ru/forum/extjs/62978-otlov-servernykh-oshibok-%7Bsuccess-false%7D.html)

khusamov 10.05.2016 21:11

Отлов серверных ошибок {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 вроде не получается. Так как нет событий, связанных с ошибками в прокси...

Infarch 11.05.2016 10:48

Для стора я переписывал onBatchException - помогло.

khusamov 11.05.2016 11:36

Цитата:

Сообщение от Infarch (Сообщение 416214)
Для стора я переписывал onBatchException - помогло.

Глобально? При помощи override?

Может лучше домен свой сделать? Вот такой например:




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);
    }

});

Infarch 11.05.2016 11:49

Нет, не глобально. Просто когда создавал свои сторы, при необходимости добавлял этот обработчик, а что он делал это уже зависело от конкретного случая.

Насчет домена я согласен, идея тоже интересная. Но я ими никогда не пользовался, тут еще надо осмыслить. А как вы его думаете использовать? Подписаться на exception в глобальном контроллере приложения?

khusamov 11.05.2016 11:51

Цитата:

Сообщение от Infarch (Сообщение 416218)
А как вы его думаете использовать? Подписаться на exception в глобальном контроллере приложения?

Подключить домен в app.js через requires.
И да, потом подписываться в listen.

khusamov 11.05.2016 11:53

Странно, что нигде ситуация success:false не обрабатывается.

khusamov 13.05.2016 12:58

В общем, попробую домен сделать. Потом расскажу что из этого вышло.

Raydezm 18.05.2016 23:26

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

Но не рекомендую, он приватный.

khusamov 19.05.2016 13:41

Цитата:

Сообщение от Raydezm (Сообщение 416964)

Мне нужен глобальный отлов. А локально как ловить я знаю.

nohuhu 19.05.2016 22:19

Для таких вещей, как централизованная обработка событий и т.п. есть более адекватный вид транспорта, называется Ext Direct. Голые Ajax запросы всегда были хаковым хаком, им и останутся. Что в переводе на русский означает: всё вручную.

khusamov 23.05.2016 22:17

А для Ext Direct есть какие-то готовые серверные библиотеки для Node.js и PHP? Чтобы не писать с нуля реализацию протокола.

REST настолько прост, что особо и писать там нечего. С RPC не все так просто оказалось.

nohuhu 23.05.2016 23:01

Цитата:

Сообщение от khusamov (Сообщение 417419)
А для Ext Direct есть какие-то готовые серверные библиотеки для Node.js и PHP? Чтобы не писать с нуля реализацию протокола.

Для Node.js есть модуль, который ведёт один из наших ребят: https://github.com/jurisv/nodejs.extdirect. Есть даже статейка в нашем уютном бложике: https://www.sencha.com/blog/writing-...nd-in-node-js/.

Цитата:

REST настолько прост, что особо и писать там нечего. С RPC не все так просто оказалось.
Ага, это все так думают. Сперва. С виду-то оно "настолько простое", но как только начинаешь влазить в детали, так оттуда черти и лезут - но обычно уже слишком поздно, потому как пол-проекта уже написано, и дедлайн... Сколько я видел реализаций Ajax транспорта с серверной стороны, так либо там глюк на хаке и костылём погоняет, либо что-то, подозрительно похожее на доморощенную RPC. Зачем вам доморощенная RPC, если всё уже украдено до вас?

khusamov 23.05.2016 23:42

Я правильно понимаю, что в RPC в качестве маршрута используется имя функции? В данном случае "Server.Demo.Todo.create" (взято из примера https://github.com/jurisv/extdirect....el/TodoItem.js)
То есть по сути, я могу взять любую реализацию RPC?

khusamov 24.05.2016 00:19

Он на вебсокетах сделан? Или такой же медленный как REST?

nohuhu 24.05.2016 02:04

Цитата:

Сообщение от khusamov (Сообщение 417429)
Я правильно понимаю, что в RPC в качестве маршрута используется имя функции? В данном случае "Server.Demo.Todo.create" (взято из примера https://github.com/jurisv/extdirect....el/TodoItem.js)
То есть по сути, я могу взять любую реализацию RPC?

Можете взять любую реализацию Ext Direct, клиент встроен в framework, а сервер вам нужен свой. RPC это общее название технологии, Ext Direct одна из реализаций.

Цитата:

Он на вебсокетах сделан? Или такой же медленный как REST?
Штатная реализация на Ajax, но гораздо быстрее REST из-за пакетных запросов. Реализацию на web sockets я видел где-то в форуме. Штатной такой нет, т.к. мы всё же стараемся быть платформонезависимыми и на серверную сторону чересчур уж не лезть, а с web sockets такой фикус не прокатывает - там при любом раскладе надо окапываться на сервере по уши.

В любом случае web sockets уже потеряли смысл, ибо грядет царствие HTTP/2.0 и чем скорее оно приидет, тем лучше будет всем.

khusamov 24.05.2016 10:40

И как тогда глобально отлавливать ошибки, если я перейду с одного вида прокси на другое? Проблема остается нерешенной же.

nohuhu 24.05.2016 21:20

Вам же надо было отлавливать все ошибки централизованно? Ext.direct.Manager на каждую ошибку стреляет событие exception, на себе и по шине Direct. Ловите контроллером и обрабатывайте, как нужно.

khusamov 10.06.2016 15:52

Начал с этой темой разбираться. Смотрю пример. Не смог найти определение переменной Server.API (строка 40)
https://github.com/jurisv/extdirect....Application.js

где она определена???

khusamov 10.06.2016 17:39

хехе я правильно понял, что переменная Server.API определяется вот таким хитрым способом?
{
            "path": "/directapi",
            "remote": true
        }

взято из файла https://github.com/jurisv/extdirect....extjs/app.json со строки 111

nohuhu 10.06.2016 22:35

Цитата:

Сообщение от khusamov (Сообщение 419016)
хехе я правильно понял, что переменная Server.API определяется вот таким хитрым способом?
{
            "path": "/directapi",
            "remote": true
        }

взято из файла https://github.com/jurisv/extdirect....extjs/app.json со строки 111

Это один из возможных вариантов. Декларация Direct API это просто набор вложенных объектов JavaScript с перечислением классов и методов, которые сервер поддерживает. Такой объект можно создавать разными способами; каноническим подходом является генерирование куска JavaScript кода на сервере с последующим включением URI к этому коду на клиенте, как и сделано в данном примере.

Есть и более интересные варианты с динамической загрузкой деклараций и созданием Providers по необходимости. В KitchenSink есть раздел с примерами на эту тему.

Можно даже включать этот код в сборку приложения, клиенту в сущности важно лишь чтобы к моменту создания Provider объект с декларацией уже существовал.

khusamov 11.06.2016 00:12

Есть что-нибудь посвежее чем этот модуль?
https://github.com/jurisv/nodejs.extdirect

Он похоже не поддерживается.
ЕС6 игнорирует.
С путями проблемы, требует чтобы скрипт, генерирующий процесс и папка с API лежали на одном уровне.

khusamov 11.06.2016 00:53

Можете поздравить. Прикрутил модуль https://github.com/jurisv/nodejs.extdirect к своему приложению.

Правда с путями к API проблема. Там нельзя указать абсолютный путь. Что с этим делать пока не знаю...
Если разрабы ничего не будут делать, то придется этот модуль переписывать самому. В таком виде он не совсем удобоварим.

nohuhu 13.06.2016 21:13

Поздравляю. ;) Насколько я знаю, этот модуль вполне поддерживается, так что открывайте тикеты и задавайте вопросы. Автор модуля, Юрис, по-русски говорит отлично. ;)

khusamov 07.03.2017 20:41

Ура! Сделал домен и теперь можно глобально отлавливать ошибки из прокси!

khusamov 07.03.2017 21:03

Вот пример кода:

/**
 * Глобальный отлов серверных ошибок (для таблиц 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
		});
	}

});

nohuhu 08.03.2017 23:34

Интересный пример, но я бы ловил ошибки на транспорте; когда данные уже доползли до reader, обычно бывает уже поздно пытаться что-то делать с запросом.

В Ext Direct есть механизм исключений, можно бросать их на сервере при обработке запросов и ловить на клиенте.

khusamov 08.03.2017 23:35

А что значит ловить ошибки на транспорте?

khusamov 26.03.2017 23:20

Если речь идет (ловить на транспорте) до того, как данные превратятся в JSON, то данные будут ДВА РАЗА превращаться в JSON. Что не есть хорошо.


Часовой пояс GMT +3, время: 13:25.