Как подключить вместо симуляции реальный сервер?
Есть отличная симуляция сервера для отладки
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/? |
Так настройте web-сервер(апач например) на папку с проектом и все...
|
Включил сервер. Прописал путь к ресурсу, добавив адрес сервера "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. Почему прокси так себя ведет? |
|
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/". . |
Сделал маленький тестовый пример:
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. |
У меня приложение грузится с адреса http://localhost:1841/ (по команде sencha app watch).
А сервер находится на адресе http://localhost:3000/ Если в прокси ставлю URL http://localhost:3000/, то Request Method:OPTIONS, вместо GET Но вот если поставлю такой URL http://localhost:1841/, то уже GET. Получается если домен разный, то прокси вместо GET начинает генерировать OPTIONS. Почему? |
Кстати, в консоли две ошибки. Вот они:
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 А вот вторая странная. Перевод: Цитата:
Цитата:
|
Решил проблему.
В итоге, если делать запросы с другого домена, то на сервере об этом нужно знать. Сервер должен дать добро. Он должен знать с какого домена идет запрос и выдать на него разрешение. Причем это делается ДВА раза. При запросе 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-* К сожалению, решение сложное. Так что возвращаюсь к исходному вопросу, как сделать ПРОКСИ? . |
Хотя нет, нашел простое решение для 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-*), но проблему исправляет. |
|
| Часовой пояс GMT +3, время: 13:50. |