 
			
				15.05.2016, 00:22
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Как подключить вместо симуляции реальный сервер?
			 
			
		
		
		
		Есть отличная симуляция сервера для отладки 
http://docs.sencha.com/extjs/6.0/6.0...jax.SimManager
Но можно ли сделать, чтобы на этом адресе
 http://localhost:1841/
работал настоящий сервер?
 
А то симуляция становится очень сложной, когда моделей много и связи между ними непростые.
 
Может в Sencha Cmd есть какой-то прокси. Например сервер доступен по адресу  http://localhost:3000/ и как-то прописать для режима sencha app watch, чтобы он был доступен и  http://localhost:1841/? 
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 13:11
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 07.06.2010 
					
					
					
						Сообщений: 146
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Так настройте web-сервер(апач например) на папку с проектом и все... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 16:07
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Включил сервер. Прописал путь к ресурсу, добавив адрес сервера "http://localhost:3000": 
Ext.define("Element.model.GroupOrder", {
	
	extend: "Element.model.Base",
	
	proxy: {
		url: "http://localhost:3000/group-orders/"
	},
В итоге вместо запроса:
 
Request URL:[url]http://localhost/group-orders/?_dc=1463403931184[/url]
Request Method:GET
 
Получаю запрос:
 
Request URL:[url]http://localhost:3000/group-orders/?_dc=1463404004806[/url]
Request Method:OPTIONS
 
Сервер конечно же такой запрос не может обработать, так как Request Method:GET поменялся на Request Method:OPTIONS.
 
Почему прокси так себя ведет?  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 16:41
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 07.06.2010 
					
					
					
						Сообщений: 146
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		- Настройки прокси ?
 
- Как сконфигурировали веб-сервер ?
 
- Какая ОС ?
 
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 16:50
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Windows 10. 
Веб-сервер с приложением нормально работают, если приложение выгнать командой sencha app watch. Так что с ним все в порядке. Он видит запрос HTTP OPTIONS //group-orders/?_dc=1463405012430 и естественно посылает его нафик, ибо ждет тоже самое, но GET.
 
Прокси настраивается в базовой модели:
 
Ext.define("Element.model.Base", {
	
	extend: "Ext.data.Model",
	
	requires: ["Ext.data.proxy.Rest"],
	
	fields: [{
		name: "id",
		type: "auto"
	}],
	
	schema: {
		namespace: "Element.model",
		proxy: {
			type: "rest", 
			reader: {
				type: "json",
				rootProperty: "data"
			}
		}
	}
	
});
А в конкретной модели уточняется URL:
 
Ext.define("Element.model.GroupOrder", {
	
	extend: "Element.model.Base",
	
	proxy: {
		url: Element.Application.serverUrl + "/group-orders/"
	},
...
где Element.Application.serverUrl = "http://localhost:3000/".
 
.  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось khusamov, 16.05.2016 в 17:24.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 17:13
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Сделал маленький тестовый пример: 
index.html
 
<!DOCTYPE HTML>
<html manifest="">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <link rel="stylesheet" type="text/css" href="ext/build/classic/theme-gray/resources/theme-gray-all.css">
    <script type="text/javascript" src="../ext/build/ext-all.js"></script>
    <script type="text/javascript" src="index.js"></script>
</head>
<body></body>
</html>
index.js
 
Ext.onReady(function() {
 	
	Ext.define('User', {
		extend: 'Ext.data.Model',
		proxy: {
			type: 'rest',
			url : 'http://localhost:3000/users'
		}
	});
	
	var myStore = Ext.create('Ext.data.Store', {
		model: 'User',
		autoLoad: true
	});
});
В консоли отобразилось следующее:
 
Request URL:http://localhost:3000/users?_dc=1463407911716&page=1&start=0&limit=25
Request Method:OPTIONS
Status Code:404 Not Found
Remote Address:[::1]:3000
 
То есть снова Request Method:OPTIONS, вместо GET.  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 17:23
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		У меня приложение грузится с адреса  http://localhost:1841/ (по команде sencha app watch). 
А сервер находится на адресе  http://localhost:3000/
Если в прокси ставлю URL  http://localhost:3000/, то Request Method:OPTIONS, вместо GET
 
Но вот если поставлю такой URL  http://localhost:1841/, то уже GET.
 
Получается если домен разный, то прокси вместо GET начинает генерировать OPTIONS. Почему?  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 17:31
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Кстати, в консоли две ошибки. Вот они: 
ext-all-rtl-debug.js?_dc=1463408894669:24866 OPTIONS http://localhost:3000//group-orders/?_dc=1463408898753 Ext.define.start @ ext-all-rtl-debug.js?_dc=1463408894669:24866Ext.define.request @ ext-all-rtl-debug.js?_dc=1463408894669:25925Ext.define.sendRequest @ ext-all-rtl-debug.js?_dc=1463408894669:88043Ext.define.doRequest @ ext-all-rtl-debug.js?_dc=1463408894669:88034Ext.define.read @ ext-all-rtl-debug.js?_dc=1463408894669:87404Ext.define.doExecute @ ext-all-rtl-debug.js?_dc=1463408894669:78724Ext.define.execute @ ext-all-rtl-debug.js?_dc=1463408894669:78391Ext.define.flushLoad @ ext-all-rtl-debug.js?_dc=1463408894669:86438(anonymous function) @ ext-all-rtl-debug.js?_dc=1463408894669:6680(anonymous function) @ ext-all-rtl-debug.js?_dc=1463408894669:7271
 
localhost/:1 
XMLHttpRequest cannot load http://localhost:3000//group-orders/?_dc=1463408898753. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:1841' is therefore not allowed access. The response had HTTP status code 404.
 
Первая это запрос OPTIONS 
 
А вот вторая странная.
 
Перевод:
 
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	
		Response to preflight request doesn't pass access control check:  
No 'Access-Control-Allow-Origin' header is present on the requested resource.  
Origin 'http://localhost:1841' is therefore not allowed access.  
The response had HTTP status code 404.
	 | 
 
	
 
 
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	
		Ответ на предполетной запроса не проходит проверку контроля доступа: 
Нет 'Access-Control-Allow-Origin' заголовок присутствует на запрошенный ресурс. 
Происхождение 'HTTP: // локальный: 1841', следовательно, не имеет права доступа. 
Ответ был код состояния HTTP 404.
	 | 
 
	
 
 Это что получается, что сервер должен обработать запрос OPTIONS?  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 17:57
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Решил проблему.  
В итоге, если делать запросы с другого домена, то на сервере об этом нужно знать. Сервер должен дать добро. Он должен знать с какого домена идет запрос и выдать на него разрешение. Причем это делается ДВА раза. При запросе OPTIONS:
 
res.set({
	"Access-Control-Allow-Origin": "http://localhost:1841",
	"Access-Control-Allow-Headers": "x-requested-with",
	"Access-Control-Allow-Methods": "GET,PUT,DELETE,OPTIONS"
});
И при запросе GET:
 
res.set({
	"Access-Control-Allow-Origin": "http://localhost:1841"
});
Примеры кода для сервера у меня даны для Express for Node.js.
 
Иными словами, сервер должен корректно обрабатывать запрос OPTIONS и заголовки прочих запросов начинающиеся на Access-Control-Request-*
 К сожалению, решение сложное. Так что возвращаюсь к исходному вопросу, как сделать ПРОКСИ?
.  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.05.2016, 18:13
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Соединяю Node.js и Ext JS 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2009 
					
					
					
						Сообщений: 1,033
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Хотя нет, нашел простое решение для Express for Node.js: 
app.use(function(req, res, next) {
	let origin = req.get("Origin");
	if (_.includes(["http://localhost:1841", "http://172.16.209.1:1841"], origin)) {
		res.set("Access-Control-Allow-Origin", origin);
	}
	next();
});
app.options("*", function(req, res) {
	res.set({
		"Access-Control-Allow-Headers": "x-requested-with",
		"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS"
	});
	res.send();
});
Решение кривое (так как это не есть полноценная обработка запросов OTIONS и заголовков Access-Control-Request-*), но проблему исправляет.  
		
	
		
		
		
		
		
			
				__________________ 
				Хусамов Сухроб, Москва, khusamov@yandex.ru 
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось khusamov, 23.05.2016 в 15:09.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |