Вопросы и ответы
Как добавлять собственные ресурсы (картинки, ...)?
При разработке приложения, часто встаёт вопрос о том, как добавить, например, картинку. Так как разработка ведётся не только над одним приложением в изолированной среде, а над приложением, загружающим в одну и ту же область видимости несколько других приложений и использующие, по сути, одну и ту же директорию с ресурсами, нужно разделять эти ресурсы уникальными путями. Для решения этой задачи предлагается в директории/src/assets
создать поддиректорию с названием, соответствующим названию вашего веб-компонента.**Самое важное здесь - уникальность имени.**Тогда, при слиянии директорийassets
всех веб-компонентов и рутового приложения в одну, не возникнет ситуаций перезаписи одних и тех же ресурсов другими.
Как решать проблему с CORS
Для решения проблемы с CORS используется гейтвей. Гейтвей должен быть доступен по адресуhttp://<domain>/api
. Тогда запросы будут в рамках одного домена и ошибки CORS не возникнет.
Например:
- Хотим сделать запрос с домена
http://<domain>
к ресурсуhttp://<domain>/service/rest/resource
. - Домен
http://<domain>/
заводится в настройки гейтвея (задача DevOps или администратора). - Теперь, если сделать запрос на
http://<domain>/api/service/rest/resource
, - это будет равноценно запросу наhttp://<domain>/service/rest/resource
, то есть вызов пройдет через гейтвей, который находится на том же домене.
Как настроить базовые адреса всех сервисов QPalette
Для рутового приложения
Прописать вsrc/assets/data/config.base.json
базовые URL для загрузчиков бандлов, виджетов и модуля авторизации:
'bundleLoader': {
'bundleUrl': '/api/$service/$component/main.js'
},
'widgetLoader': {
'bundleUrl': '/api/$service/widgets/$component/main.js'
},
'widgets': {
'bundleUrl': '/api/$service/$component/widgets/$widget/main.js'
},
'auth': {
'service': 'default',
'options': {
'authDataServiceConfig': {
'urls': {
'base': '/api'
}
}
}
},
Рутовое приложение нужно брать из ветки master.
Для веб-компонента
В секцииimports
вAppModule
веб-компонента нужно импортировать модулиQWidgetLoaderModule
иQAuthModule
с конфигурацией из сервисаQCoreService
:
@NgModule({
imports: [
QWidgetLoaderModule.forRoot(QCoreService.config.widgetLoader),
QAuthModule.forRoot(QCoreService.config.auth)
QWidgetModule.forRoot(QCoreService.config.widgets),
],
})
Для построения URL-адресов к REST-ресурсам использоватьQUrlService
, как описано в документации (см. вариант сbaseUrl = QCoreService.config.apiBaseUrl
).
Если запросы к /api выдают 404 ошибку
Если запросы к /api выдают 404 ошибку, то нужно в Kubernetes настроить ингрессы таким образом (для этого обратитесь к вашему DevOps-специалисту):
nginx.ingress.kubernetes.io/rewrite-target: /$1
rules:
- host: some.product.namespace.diasoft.ru
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: ИМЯ ВАШЕГО СЕРВИСА
port:
number: 8080
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: ИМЯ СЕРВИСА MDPGATEWAY
port:
number: 8080
Прокси
Проксирование к бэкендному серверу
Используйте поддержку прокси-сервера на сервере разработки webpack, чтобы перенаправлять определенные URL-адреса на внутренний сервер, передавая в файл--proxy-config
параметр сборки. Например, для переадресации всех вызововhttp://localhost:4200/api
на сервер, работающий наhttp://localhost:3000/api
, выполните следующие действия:
- Создайте файл
proxy.conf.json
в папке src/ вашего проекта. - Добавьте следующее содержимое в новый прокси-файл:
- В файле конфигурации CLI,
angular.json
, добавьте параметр конфигурации прокси-сервера к целиserve
: - Чтобы запустить сервер разработки с этой конфигурацией прокси-сервера, вызовите
serve
.
Отредактируйте файл конфигурации прокси-сервера, чтобы добавить параметры конфигурации; ниже приведены некоторые примеры. Описание всех опций см. в документации webpack DevServer documentation (opens in a new tab).
Обратите внимание, что если вы редактируете файл конфигурации прокси-сервера, вы должны перезапустить процесс ng serve, чтобы ваши изменения вступили в силу.
Переназначение пути к URL-адресу
Параметр конфигурации прокси-сервераpathRewrite
позволяет переписать путь URL во время выполнения. Например, укажите следующее значениеpathRewrite
для конфигурации прокси-сервера, чтобы удалить "api" из конца пути.
{
"/api": {
"target": "http://localhost:3000",
"secure": false,
"pathRewrite": {
"^/api": ""
}
}
}
Если вам нужно получить доступ к серверной части, которая не находится наlocalhost
, также установите параметрchangeOrigin
Например:
{
"/api": {
"target": "http://npmjs.org",
"secure": false,
"pathRewrite": {
"^/api": ""
},
"changeOrigin": true
}
}
Чтобы помочь определить, работает ли ваш прокси-сервер должным образом, установите параметрLogLevel
. Например:
{
"/api": {
"target": "http://localhost:3000",
"secure": false,
"pathRewrite": {
"^/api": ""
},
"logLevel": "debug"
}
}
Уровни журнала прокси-сервера - этоinfo
(по умолчанию),debug
,warn
,error
иsilent
.
Прокси с несколькими записями
Вы можете перенаправить несколько записей на один и тот же целевой объект, определив конфигурацию в JavaScript.
Установите в файле конфигурации проксиproxy.conf.js
(вместоproxy.conf.json
) и укажите файлы конфигурации, как в следующем примере.
const PROXY_CONFIG = [
{
context: [
"/my",
"/many",
"/endpoints",
"/i",
"/need",
"/to",
"/proxy"
],
target: "http://localhost:3000",
secure: false
}
]
module.exports = PROXY_CONFIG;
В файле конфигурации CLI,angular.json
, укажите на файл конфигурации прокси-сервера JavaScript:
...
"architect": {
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "your-application-name:build",
"proxyConfig": "src/proxy.conf.js"
},
...
Обход прокси
Если вам нужно дополнительно обойти прокси-сервер или динамически изменить запрос перед его отправкой, добавьте опцию обхода, как показано в этом примере JavaScript.
const PROXY_CONFIG = {
"/api/proxy": {
"target": "http://localhost:3000",
"secure": false,
"bypass": function (req, res, proxyOptions) {
if (req.headers.accept.indexOf("html") !== -1) {
console.log("Skipping proxy for browser request.");
return "/index.html";
}
req.headers["X-Custom-Header"] = "yes";
}
}
}
module.exports = PROXY_CONFIG;
Использование корпоративного прокси
Если вы работаете за корпоративным прокси-сервером, серверная часть не может напрямую перенаправлять вызовы на любой URL-адрес за пределами вашей локальной сети. В этом случае вы можете настроить прокси-сервер для перенаправления вызовов через ваш корпоративный прокси-сервер с помощью агента:
npm install --save-dev https-proxy-agent
Когда вы определяете переменную окруженияhttp_proxy
илиHTTP_PROXY
, автоматически добавляется агент для передачи вызовов через ваш корпоративный прокси-сервер при запускеnpm start
.
Используйте следующее содержимое в файле конфигурации JavaScript.
var HttpsProxyAgent = require('https-proxy-agent');
var proxyConfig = [{
context: '/api',
target: 'http://your-remote-server.com:3000',
secure: false
}];
function setupForCorporateProxy(proxyConfig) {
var proxyServer = process.env.http_proxy || process.env.HTTP_PROXY;
if (proxyServer) {
var agent = new HttpsProxyAgent(proxyServer);
console.log('Using corporate proxy server: ' + proxyServer);
proxyConfig.forEach(function(entry) {
entry.agent = agent;
});
}
return proxyConfig;
}
module.exports = setupForCorporateProxy(proxyConfig);
Как узнать какие роли у моего пользователя?
Вы можете проверить, есть ли у Вашего пользователя соответствующая роль, скопировав свой access_token (можно посмотреть в network-вкладке браузера в ответе запроса к mdpauth при авторизации), вставив его в поле Encoded в сервисе https://jwt.io/ (opens in a new tab) и проверить поле authorities в блоке Decoded.
Как перейти на какой-то URL-адрес, кликнув по пункту из меню?
Эта задача очень легко осуществима. Просто добавьте к вашему пункту меню ключlink
, значение которого отображает требуемый адрес.
{
"caption": "Сайт компании Диасофт",
"link": "https://diasoft.com"
}
При этом ключиservice
,component
иroute
будут проигнорированы.