Используйте среду для установки свойства proxy.config.js для ng serve

Название в значительной степени подводит итог. У меня есть файл proxy.conf.js, который попал в ng serve, и я просто хочу получить целевой URL-адрес из файла ts среды или файла json, или мне все равно на данный момент, я просто хочу одно место для хранения URL-адреса, который питает другие соответственно...

Итак, environment.congif.ts (который не включен ни в какие конфигурации, просто файл для хранения объекта настроек, который в настоящее время передает environment.dev.ts и не может передать proxy.conf.js);

export const environment = {
    production: false,
    apiUrl: 'http://localhost:12345'
};

Затем proxy.conf.js;

var settings = require('./src/environments/environment.config');

const PROXY_CONFIG = [{
    "/restapi/*": {
      "target": settings.environment.apiUrl,
      "secure": false,
      "changeOrigin": true,
      "logLevel": "debug"
    }
}]

module.exports = PROXY_CONFIG

Чего по какой-то причине я явно не понимаю (тем более, что intellisense прекрасно заполняет путь как для файла, так и для свойства). Я получаю сообщение об ошибке ng serve;

Cannot find module './src/environments/environment.config'
Error: Cannot find module './src/environments/environment.config'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
........

Итак, мой вопрос: почему это не может решить таким образом? Я просто хочу, чтобы один файл устанавливал целевой URL-адрес, который отправляет нужные места из environment.config.ts

ДОПОЛНЕНИЕ . Таким образом, файлы environment.*.ts находятся в папке /src/environments, как и при любой установке по умолчанию. proxy.conf.js находится в корне проекта вместе с другими файлами по умолчанию, такими как package.json или angular.json. Все пути правильные, intellisense даже заполнит значения, но по какой-то причине proxy.conf.js не будет хорошо работать при импорте объекта const из среды (хотя при сборке, как я уже сказал, intellisense находит все просто отлично). Итак, как видно из названия, единственная проблема, с которой я сталкиваюсь, - это чтение URL-адреса в прокси-файл js из файла среды ts, так что у меня есть только один файл для поддержки apiurl.


person Chris W.    schedule 20.12.2018    source источник
comment
Ваша проблема кажется достаточно странной. Но мне очень хотелось бы знать, изменили ли вы имя environment.ts, которое по умолчанию используется на environment.dev.ts, для какой-либо конкретной цели? Я не уверен, что это из-за этого, но в angular.json упоминается, что этот файл будет заменен на environment.prod.ts во время производственной сборки. Этой ошибки не должно быть, поскольку эта команда выполняется во время производственной сборки, но все же попробуйте использовать значение по умолчанию environment.ts, чтобы увидеть, что ошибка все еще сохраняется. И, конечно же, эти два файла предназначены только для настройки конфигураций производства и разработки.   -  person sndpkpr    schedule 26.12.2018
comment
Вы пытались использовать его как environment.dev.js? Я не думаю, что webpack-сервер готов транспилировать ts.   -  person lossleader    schedule 26.12.2018
comment
@Сандип. Я. environment.ts заменяется конфигурацией сборки. Так, например, ng build --prod заменит environment.ts на environment.prod.ts, у меня там есть совершенно отдельный файл, не включенный ни в одну конфигурацию сборки, с конкретным намерением использовать его для хранения конфигураций dev (все, что угодно без --prod флаг), который я пытаюсь использовать для передачи proxy.conf.js и environment.dev.ts, environment.dev.ts отлично импортирует его для своих настроек, проблема заключается в proxy.conf.js требовать. :/   -  person Chris W.    schedule 26.12.2018
comment
@lossleader да, он отлично импортирует в environment.dev.ts, подробнее см. Предыдущий комментарий. По какой-то причине требование в proxy.conf.js является виновником, который не хочет читать объект, содержащий настройки. Может быть, какое-то незнание синтаксиса es6 и commonjs? На данный момент не уверен.   -  person Chris W.    schedule 26.12.2018
comment
Под webpack-сервером я подразумеваю webpack-dev-сервер. Он читает конфиг прокси и не понимает ts.   -  person lossleader    schedule 26.12.2018
comment
@lossleader да, я также пробовал просто плоский файл json, чтобы передать его с помощью require (..), я знаю, что в машинописном тексте ^ 2.9.2 есть некоторые исправления, которые позволяют это сделать, но я все еще использую машинописный текст 2.7.2, который немного рефакторинга необходимо будет выполнить для обновления с настоящего момента. Я надеялся, что это было просто невежество в отношении нюансов управления версиями машинописного текста или что-то глупое, что я упустил.   -  person Chris W.    schedule 26.12.2018
comment
@КрисВ. можешь попробовать import { environment } from './src/environments/environment.config'; вместо var settings = require('./src/environments/environment.config'); ?   -  person sndpkpr    schedule 26.12.2018
comment
@Sandeep Ya, который просто выдает мне SyntaxError: Unexpected token import, хотя в этом и заключается моя проблема, поэтому, даже если я попробую просто общий import * as blah from './path/to/environment.config', я просто получаю ту же ошибку, которая может быть частью проблемы с версией машинописного текста? Вот где я не уверен, к сожалению, так как я не гуру версий, лол.   -  person Chris W.    schedule 26.12.2018
comment
@Sandeep, require будет просто в файле .js, все, что .ts прекрасно обрабатывает импорт из другого файла ts.   -  person Chris W.    schedule 26.12.2018
comment
Привет @ChrisW. Я думаю, может быть, что файлы расширения js в angular можно импортировать вот так const { SpecReporter } = require('jasmine-spec-reporter'); Я прочитал его по умолчанию protractor.conf.js. Попробуйте. Ву! но я почти забыл, что мы можем использовать расширение js в angular, лол. машинопись   -  person sndpkpr    schedule 26.12.2018
comment
Я думаю, вы можете либо переключиться на environment.config.js в качестве общего формата, либо настроить вашу IDE на транспиляцию в том же каталоге, чтобы она читала js для прокси и TS во встроенных модулях.   -  person lossleader    schedule 26.12.2018
comment
Можете ли вы отредактировать свой вопрос, включив в него файловую структуру и файл angular.json? похоже, что это всего лишь проблема «неправильного пути»   -  person benshabatnoam    schedule 31.12.2018
comment
Если я правильно понимаю вашу проблему, вы хотите каким-то образом поймать свою конфигурацию с помощью URI при запуске приложения, чтобы вы могли использовать его значения в другом месте?   -  person Sergey    schedule 31.12.2018
comment
@benshabatnoam добавил дополнительную информацию, однако файловая структура по умолчанию с angular.json и т. Д. В корне проекта с proxy.conf.js в качестве родственного, файлы среды в /src/environments и intellisense будут читать путь и даже атрибуты объекта просто отлично. Однако при сборке у меня возникает проблема с proxy.conf.JS.   -  person Chris W.    schedule 31.12.2018


Ответы (4)


Привет, Крис. Если вам нужно настроить прокси, вам нужно создать собственный файл с именем proxyconfig.json и поместить его в каталог приложения, который будет находиться вне папки src вашего приложения.

1- смоделируйте, что вам нужно получить некоторые данные из этой конечной точки, прежде чем вы настроите свой прокси-файл.

this.http.get('http://locahost:3000/api/v1/people')
  

2- proxyconfig.json будет содержать этот json

{
  "/api/*": { // 
    "target": "http://localhost:3000", // the target url for backend endpoint
    "secure": false,
    "logLevel": "debug",
    "changeOrigin": true
  }
}

3- вам нужно внести некоторые изменения в ваш package.json

   "scripts": {
      "start": "ng serve -- --proxy-config ../../proxyconfig.json",
      ...
   }
} 

4- конечная точка в вашей службе должна быть изменена на

this.http.get('/api/v1/people')
  

5- запуск ng serve прокси будет успешно работать

Надеюсь, это поможет :))

person Ahmed hussien    schedule 20.12.2018
comment
Привет! Да, у меня есть прокси-сервер и он работает нормально, если у меня есть URL-адрес непосредственно в файле proxy.conf.js, но я пытаюсь сделать так, чтобы он читал URL-адрес из настроек среды (src/environments/environment.ts ), так как я настроил его на замену в зависимости от среды. Так, например, в environment.dev.ts уже есть URL-адрес прокси-сервера, как показано, я хочу прочитать (требовать) это значение в proxy.conf.js, поэтому есть только один файл, который требуется разработчику для обновления url:port в который питает все, что в нем нуждается. Однако спасибо за попытку помочь! - person Chris W.; 21.12.2018
comment
@КрисВ. вы можете поместить свою конфигурацию в какой-нибудь JSON. Затем получите его через http.get, как описано. Затем вы можете использовать значение в соответствии со средой (в Angular есть способ узнать, какая среда запущена) - person Sergey; 31.12.2018

Таким образом, проблема здесь оказалась в версии машинописного текста и отсутствии в нем импорта или необходимости поддержки. Если вы используете что-то вроде v3, вы не столкнетесь с той же проблемой. Спасибо, что посмотрели!

person Chris W.    schedule 01.03.2019

Вы можете сделать это аналогичным образом https://stackblitz.com/edit/angular-2uz6n8

Я сделал это, просто поместив обе переменные среды в один файл.


Почему бы вам просто не использовать предопределенные переменные среды? Вы можете легко добавить некоторые свойства к environment.ts и environment.prod.ts и получить доступ к этим свойствам через import { environment } from './environment';, а затем будет использоваться просто envoronment.ANY_KEY_YOU_WANT соответствующий файл среды.

person Sergey    schedule 31.12.2018
comment
Все файлы среды работают нормально, в настоящее время у меня разные конфигурации, все настроено и работает правильно. Проблемы в файле proxy.conf.js, который я также пытаюсь импортировать из файла environment*.ts, но спасибо за попытку помочь :) - person Chris W.; 31.12.2018
comment
@КрисВ. вы уверены, что вам нужно импортировать именно файл .js? На самом деле это не настраивается. Если вы хотите импортировать environment и использовать его переменную, стоит использовать import { environment } from '...' Похоже, вы объединили разные подходы к модулям, и это приводит к ошибке, поскольку export const NAME требует import { NAME } from '' - person Sergey; 31.12.2018

Транспайл в памяти (как я это решил)

Здесь нет хороших решений, потому что Angular хочет, чтобы файлы окружения были TypeScript, а прокси-конфигурации — JavaScript (или JSON). Есть несколько способов восполнить этот пробел. Мой подход состоял в том, чтобы транспилировать файл среды в памяти - они, как правило, крошечные, простые и хорошо содержащиеся, и у вас все равно установлен TypeScript. Это верхняя часть моего src/proxy.conf.js, до фактического использования значений из environment:

/*
 * Based on reference here:
 * https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API#a-simple-transform-function
 *
 * Loads, transpiles, and executes a Typescript module.
 * This is very simple, literally just enough for an environment.ts file.
 */
function load_ts(filename) {
    const fs = require('fs');
    const ts = require('typescript');

    // Load and transpile to JS
    let ts_code = fs.readFileSync(filename, 'utf-8');
    let js_code = ts.transpileModule(ts_code, {
        compilerOptions: { module: ts.ModuleKind.CommonJS }
    }).outputText;

    // Execute JS. We need 'exports' to exist, or this breaks.
    let exports = {};
    return eval(js_code);
}

const environment = load_ts('./src/environments/environment.ts');

// ...

У этого есть некоторые преимущества в том, что он работает именно тогда, когда вам это нужно, он неразрывно связан с ng serve (при условии, что вы указываете на него в angular.json) и в целом оказывает незначительное влияние на рабочий процесс. Это также означает, что если вам нужно, чтобы ваша конфигурация прокси-сервера была JavaScript, а не JSON (для эксклюзивных функций JS), об этом довольно просто подумать. Но это предполагает, что ваш файл environment.ts не делает ничего слишком захватывающего или умного - обычно справедливое предположение, но если вы делаете импорт в environment.ts, вам может понадобиться другой подход.


Внеполосная компиляция (альтернатива)

Если вы заключаете свои команды в npm run ... вместо того, чтобы напрямую использовать ng serve, у вас есть возможность написать конфигурацию прокси-сервера в TypeScript и скомпилировать ее перед запуском ng serve:

/*   src/proxy.conf.ts   */
import * as environment from './environments/environment';
  
export = {
    '/api': {
        target: (<any>environment).api_server || 'http://example.com',
        changeOrigin: true,
        logLevel: "debug",
        // ...
    }
}

И в вашем package.json (только включая соответствующие части)...

{
  "scripts": {
    "start": "npm run proxy-config && ng serve",
    "proxy-config": "tsc --types node --module commonjs src/proxy.conf.ts"
  }
}

И, конечно же, вы указываете свою конфигурацию angular на сгенерированный файл src/proxy.conf.js.

У этого есть несколько неприятных черт (генерирует src/environments/environment.js, немного медленнее при запуске, не запускается, если вы не обертываете свои команды, легче ошибиться), но, вероятно, это самый гибкий доступный вариант.

Очень похожий вариант (ТОЛЬКО транспиляция src/environments/environment.js, написание вручную src/proxy.conf.js с импортом JS) имеет те же преимущества, но оставлен читателю в качестве упражнения.

person Campadrenalin    schedule 24.07.2020