Конфигурация прокси не работает в angular 6

У меня есть угловая версия metronic_v5.5.2, и я пытаюсь интегрировать ее угловую версию с моим внутренним API.

Поскольку я новичок во всем этом, проблема заключается в том, что моя конфигурация прокси-сервера не работает в соответствии с моими ожиданиями.

Ниже приведен код файла proxyconfig.json.

{
    "/api": {
        "target": "https://localhost:5001",
        "secure": false,
        "changeOrigin": true,
        "logLevel": "debug"
    }
}

Изображение показывает, что запрос направляется по URL-адресу «https: // localhost: 5001 / api / auth / login». POST / api / auth / логин -> https: // localhost: 5001

Но в консоли браузеров этот запрос фактически направляется на URL-адрес http: // локальный: 4200 / api / auth / логин, который возвращает ошибку 401. Я не могу при нажатии кнопки перейти к URL-адресу: https: // локальный: 5001 / api / auth / логин

Ниже приведен HTML-код.

<!--begin::Form-->
<form class = "m-login__form m-form" name = "form" (ngSubmit) = "f.form.valid && submit()" #f = "ngForm" novalidate>
    <div class = "form-group">
        <mat-form-field>
            <mat-label>Email</mat-label>
            <input matInput type = "email" name = "email" placeholder = "Email address" autocomplete = "off" [(ngModel)] = "model.email" #email = "ngModel" email = "true" required>
        </mat-form-field>
    </div>
    <div class = "form-group">
        <mat-form-field>
            <mat-label>Password</mat-label>
            <input matInput minlength = "4" type = "password" name = "password" placeholder = "Password" autocomplete = "off" [(ngModel)] = "model.password" #password = "ngModel" required>
        </mat-form-field>
    </div>
</form>
<!--end::Form-->

<!--begin::Action-->
<div class = "m-login__action m-login__action--fit">
    <a href = "javascript:;" (click) = "forgotPasswordPage($event)" class = "m-link">
        <span translate = "AUTH.GENERAL.FORGOT_BUTTON">Forgot Password?</span>
    </a>
    <m-spinner-button [options] = "spinner" (click) = "submit()">{{'AUTH.LOGIN.BUTTON' | translate}}</m-spinner-button>
</div>

Ниже приведен код login.component.ts.

submit() {
        this.spinner.active = true;
        if (this.validate(this.f)) {
            this.authServiceDb.logindb(this.model).subscribe(response => {
                    this.router.navigate(['/']);
                    this.alertify.success('Logged In Successfully');
                    this.spinner.active = false;
                    this.cdr.detectChanges();
            }, error => {
                this.alertify.error(error);
            });
        }
    }

функция код для экспортируемого класса authdb получает удар, Edit

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions, Response } from '../../../node_modules/@angular/http';
import { map, catchError } from 'rxjs/operators';
import { throwError } from '../../../node_modules/rxjs';
import { tokenNotExpired, JwtHelper } from 'angular2-jwt';

@Injectable({
    providedIn: 'root'
})
export class AuthdbService {
    baseUrl = 'api/auth/';
    userToken: any;
    decodedTokenn: any;
    jwtHelper: JwtHelper = new JwtHelper();
    constructor(private http: Http) { }
public logindb(model: any) {
    return this.http.post(this.baseUrl + 'login', model, this.requestOptions()).pipe(map((response: Response) => {
      const user = response.json();
      if (user) {
        localStorage.setItem('token', user.tokenString);
        this.decodedTokenn = this.jwtHelper.decodeToken(user.tokenString);
        this.userToken = user.tokenString;
      }
    })).pipe(catchError(this.handleError));
  }
  register(model: any) {
    return this.http.post(this.baseUrl + 'register', model, this.requestOptions()).pipe(catchError(this.handleError));
  }
  loggedIn() {
    return tokenNotExpired('token');
  }
  private requestOptions() {
    const headers = new Headers({
      'Content-type': 'application/json'});
    return new RequestOptions({headers: headers});
  }
  private handleError(error: any) {
    const applicationError = error.headers.get('Application-Error');
    if (applicationError) {
      return throwError(applicationError);
    }
    const serverError = error.json();
    let modelStateErrors = '';
    if (serverError) {
      for (const key in serverError) {
        if (serverError[key]) {
          modelStateErrors += serverError[key] + '\n';
        }
      }
    }
    return throwError(
      modelStateErrors || 'Server Eroor'
    );
  }
}

И в моем package.json у меня есть следующий код

{
    "name": "default",
    "version": "0.0.0",
    "license": "MIT",
    "scripts": {
        "ng": "ng",
        "start": "ng serve --proxy-config proxyconfig.json",
        "build": "ng build --prod",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
    },
    "private": true,
    "dependencies": {
        "@angular/animations": "^6.1.0",
        "@angular/cdk": "^6.4.0",
        "@angular/common": "^6.1.0",
        "@angular/compiler": "^6.1.0",
        "@angular/forms": "^6.1.0",
        "@angular/http": "^6.1.0",
        "@angular/platform-browser": "^6.1.0",
        "@angular/platform-browser-dynamic": "^6.1.0",
        "@angular/platform-server": "^6.1.0",
        "@angular/router": "^6.1.0",
        "@kolkov/angular-editor": "^0.10.3",
        "@ng-bootstrap/ng-bootstrap": "^2.2.0",
        "@ngx-loading-bar/core": "^2.1.1",
        "@ngx-translate/core": "^10.0.2",
        "@types/lodash": "^4.14.112",
        "alertifyjs": "^1.11.1",
        "angular-in-memory-web-api": "^0.6.0",
        "angular2-jwt": "^0.2.3",
        "chart.js": "^2.7.2",
        "classlist.js": "^1.1.20150312",
        "core-js": "^2.5.7",
        "hammerjs": "^2.0.8",
        "lodash": "^4.17.10",
        "material-design-icons": "^3.0.1",
        "ng2-charts": "^1.6.0",
        "ngx-auth": "4.0.0",
        "ngx-highlightjs": "^2.0.4",
        "ngx-perfect-scrollbar": "^6.2.0",
        "ngx-permissions": "^5.0.0",
        "object-path": "^0.11.4",
        "rxjs-compat": "^6.2.2",
        "rxjs-tslint": "^0.1.5",
        "web-animations-js": "^2.3.1",
        "zone.js": "^0.8.26"
    },
    "devDependencies": {
        "@angular-devkit/build-angular": "^0.7.0",
        "@angular/cli": "^6.0.8",
        "@angular/compiler-cli": "^6.1.0",
        "@angular/core": "^6.1.0",
        "@angular/language-service": "^6.1.0",
        "@angular/material": "^6.4.0",
        "@angular/material-moment-adapter": "^6.4.0",
        "@types/jasmine": "^2.8.8",
        "@types/jasminewd2": "^2.0.3",
        "@types/node": "^10.5.2",
        "codelyzer": "^4.4.2",
        "jasmine": "^3.1.0",
        "jasmine-core": "^3.1.0",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~2.0.4",
        "karma-chrome-launcher": "^2.2.0",
        "karma-coverage-istanbul-reporter": "^2.0.1",
        "karma-jasmine": "^1.1.2",
        "karma-jasmine-html-reporter": "^1.2.0",
        "moment": "^2.22.2",
        "protractor": "^5.3.2",
        "rxjs": "^6.2.2",
        "ts-node": "^6.0.3",
        "tslint": "~5.9.1",
        "typescript": "2.7.2"
    }
}

Если вы используете прокси, URL-адрес в браузере по-прежнему показывает локальный: 4200, даже если он действительно использует прокси. Я думаю, что ошибки нет, и вы получили истинную ошибку 401. 401 означает неавторизованный, вы уверены, что имеете право на доступ к ресурсу? Разве вам не нужно устанавливать заголовок авторизации?

Powkachu 28.08.2018 14:41

На самом деле, как я упоминал в сообщении, почтовый запрос идет по неправильному URL-адресу. Это собирается

Hafiz Siddiq 28.08.2018 20:51

"Но в консоли браузеров этот запрос фактически направляется на URL-адрес локальный: 4200 / api / auth / логин, который возвращает ошибку 401 (и это не URL-адрес для фактического API, на который я позвонил). Я протестировал API с POSTMAN, и API работает нормально , Кажется, что настройки прокси не работают из-за некоторых причин, по которым я не могу выполнить маршрутизацию при нажатии кнопки на URL-адрес: локальный: 5001 / api / auth / логин "

Hafiz Siddiq 28.08.2018 20:52

У меня была точно такая же проблема с предоставленным изображением, которое запрос на / api / auth / login неправильно направлен на локальный: 5001. Это исправлено, когда я помещаю "target": "локальный: 5001 / api" и "pathRewrite": {"^ / ​​api": ""} в конфиг. Теперь он правильно перенаправлен на локальный: 5001 / api / auth / логин.

Mandakh 25.01.2019 03:18
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
11
4
35 217
5

Ответы 5

Вы сказали, что новичок в этом, поэтому позвольте мне сначала объяснить кое-что простое.

Когда вы вызываете http.post, первым параметром является URL-адрес, по которому будет осуществляться связь. Так:

this.http.post(this.baseUrl + 'login', ...

станет

this.http.post('api/auth/login', ...

потому что вы установили baseUrl и добавили логин:

baseUrl = 'api/auth/';

Но ваш код не говорит, какой протокол использовать (http или https) ИЛИ какой домен: порт для вызова (например, http: // мойдомен: порт / api / auth / логин).

Следовательно, Angular по умолчанию будет использовать http, а также домен и порт, которые используются ИТ-специалистами, то есть localhost: 4200. Итак, ваш запрос становится таким:

http: // локальный: 4200 / api / auth / логин

Вот почему вы видите это в консоли. Angular полностью игнорирует ваш прокси-файл. Я думаю, причина либо в имени, либо в расположении (обычно оно должно быть в корневой папке вашего проекта), либо вы не сказали Angular загрузить его.

Вам нужно указать Angular, чтобы он действительно использовал его при запуске. Итак, в package.json вам понадобится что-то вроде этого:

"start": "ng serve --proxy-config proxyconfig.json"

Это сообщает Angular-CLI, что когда вы используете команду npm run start (или просто npm start) для запуска приложения, она должна загружать данные прокси из этого файла json в корневую папку.

Я бы также посоветовал почитать этот учебник.

Кроме того, я думаю, что в вашем proxyconfig отсутствует /*:

{
    "/api/*": {
        "target": "http://localhost:5001",
        "secure": false,
        "changeOrigin": true,
        "logLevel": "debug"
    }
}

У меня также есть эта строка в моем файле package.json, как вы можете видеть в отредактированном сообщении, я не могу заставить свой код работать, на самом деле я использую Matronic UI, могут возникнуть проблемы с интеграцией. Пожалуйста, расскажите мне, как действовать.

Hafiz Siddiq 03.09.2018 13:16

Я обновил свой ответ, так как у меня была небольшая ошибка - для того, чтобы прокси-файл действительно работал, вы не можете использовать ng serve, вы должны использовать npm start (который вызовет команду «start», определенную в вашем package.json). См. Это для получения дополнительной информации: stackoverflow.com/questions/40190538/…

rmcsharry 03.09.2018 22:32

Уважаемый, есть тот же результат, что и я запускаю "npm start", а затем нажимаю кнопку входа в систему, запрос идет на неправильный URL-адрес (файл конфигурации прокси не работает). Та же проблема, с которой я столкнулся здесь, после изменения моего файла proxycong.json, пожалуйста, помогите мне сейчас это слишком расстраивает.

Hafiz Siddiq 04.09.2018 10:37

@HafizSiddiq Кажется, у вас все настроено правильно, поэтому я понятия не имею, почему файл прокси не работает. Извините, но я больше ничем не могу вам помочь.

rmcsharry 04.09.2018 11:57

Я слежу за всем этим и все еще получаю 401. На бэкэнде включена проверка подлинности Windows. Это учетные данные, которые мне нужно как-то предоставить?

Mark 23.08.2019 15:23

@Mark, речь идет о интерфейсе, а не о бэкэнде. 401 означает, что ваш интерфейс не передает учетные данные для проверки подлинности исправлений - и если серверная часть использует Windows Auth, я боюсь, что не могу помочь, поскольку эти решения предназначены для отправки токена JOSN, а не учетных данных Windows Auth.

rmcsharry 26.08.2019 12:46

У меня была такая же проблема, и добавление опции proxyConfig к цели обслуживания сделало свою работу.

Перейдите в angular.json -> внутри serve добавьте пару ключ: значение "proxyConfig": "proxy.conf.json"

нравится -

"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "proxy.conf.json"
    },

кстати, я получил это от здесь

Это сработало для меня с Angular v6. Перезапись прокси, необходимая для отправки запросов в другой (не локальный) домен в моей сети, и это видение работало с моим файлом proxy.conf.js. Спасибо!

RoboBear 03.01.2019 19:41

Мне потребовалось несколько часов, чтобы исправить неправильную маршрутизацию POST / api / auth / login на https: // локальный: 5001, который находится в предоставленном вами изображении.

Следующая конфигурация исправляет маршрутизацию POST / api / auth / login на https: // локальный: 5001 / api / auth / логин.

{
    "/api": {
        "target": "https://localhost:5001/api",
        "changeOrigin": true,
        "logLevel": "debug",
        "pathRewrite": { "^/api" : "" }
    }
}

Добавьте параметр "--ssl" в ng serve:

"start": "ng serve --proxy-config proxyconfig.json --ssl",

потому что вы хотите создать безопасное соединение:

"target": "https://localhost:5001",

источник: https://www.devdungeon.com/content/how-serve-angular-locally-over-https

Чтобы настроить прокси в Angular, выполните следующие действия:

Шаг 1. В корневой папке angular, где существует файл package.json, создайте «proxy.conf.json» и добавьте ниже код -

{
  "/api/*": {
    "target": "http://xxx.xxx.xxx.xxx:80/api/",  // API URL or any URL for Proxy
    "secure": false,
    "logLevel": "debug",
    "changeOrigin": true
  }
}

Шаг 2. затем обновите файл angular.json, добавьте свойство proxyConfig свойства в архитектор -> служить -> построитель -> параметры -

"projects": {
        ...
        "angularPracticeProj": {
                "projectType": "application",
                "schematics": {},
                ...
                "architect": {
                        ...
                        "serve": {
                                ...
                                "builder": "@angular-devkit/build-angular:dev-server",
                                  "options": {
                                    "browserTarget": "angularPracticeProj:build",
                                    "proxyConfig": "proxy.conf.json"        <==== angular proxy
                                  },
                                ...
                                }
                        ...
                        }
                    }
            }
            
        

Если вы работаете с NodeJS / ExpressJS REST API, обновите файл app / root, откуда вы загружаете экспресс-версию nodejs-

Шаг 3 (необязательно). В корневом файле nodejs или ExpressJS, где определен корень приложения, добавьте код ниже -

const app = express();
            // angular app set as start
            app.use(express.static(process.cwd() + "/../dist/angularPracticeProj/")); <= angular project's published/dist index file path
            app.get('/', (req, res) => {
            res.sendFile(process.cwd() + "/../dist/angularPracticeProj/index.html")   <= angular project's published/dist index file path
    });

Другие вопросы по теме