Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2016, 00:22
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 16.05.2016, 13:11
Аватар для kolka
Кандидат Javascript-наук
Отправить личное сообщение для kolka Посмотреть профиль Найти все сообщения от kolka
 
Регистрация: 07.06.2010
Сообщений: 146

Так настройте web-сервер(апач например) на папку с проектом и все...
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2016, 16:07
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2016, 16:41
Аватар для kolka
Кандидат Javascript-наук
Отправить личное сообщение для kolka Посмотреть профиль Найти все сообщения от kolka
 
Регистрация: 07.06.2010
Сообщений: 146

  1. Настройки прокси ?
  2. Как сконфигурировали веб-сервер ?
  3. Какая ОС ?
Ответить с цитированием
  #5 (permalink)  
Старый 16.05.2016, 16:50
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2016, 17:13
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 16.05.2016, 17:23
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 16.05.2016, 17:31
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 16.05.2016, 17:57
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 16.05.2016, 18:13
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как подключить js-скрипт сразу к нескольким страницам? link_link Общие вопросы Javascript 1 28.08.2014 07:44
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как отправить данные в Form Data вместо Request Payload? Shitbox2 Angular.js 2 26.05.2013 22:40
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как сделать разделителем у массива ";" вместо "," FRIE Общие вопросы Javascript 4 16.08.2011 15:21