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.
|
|
|
|