Установите порт сервера для отправки запросов API из Angular в NodeJS в разработке - PullRequest
0 голосов
/ 26 октября 2018

У меня есть это приложение MEAN Stack, и для фронт-энда я использую Angular 6, я создал систему рутинга и бэк-энда пользователей и протестировал ее с помощью Postman, и она работает как положено.но когда я использую форму, я всегда получаю эту ошибку ниже:

enter image description here

Я знаю, что проблема в том, чтобы изменить порт с 4200 на 3000 но не нашел правильного решения.

вот мой сервис:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';

@Injectable()
export class UserService {

  constructor(
    private _httpClient: HttpClient
  ) { }


  public auth(user) {
    return this._httpClient.post('users/login', user).pipe(map((resp: any) => resp.json()));
  }

}

и вот где я использую сервис:

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { UserService } from '../../services/user.service';



@Component({
  selector: 'app-side-menu',
  templateUrl: './side-menu.component.html',
  styleUrls: ['./side-menu.component.scss']
})
export class SideMenuComponent implements OnInit {

  public positionsList: Array<any> = [];
  public selectedOption: string;
  public feedbackMessage: string;

  public email: string;
  public password: string;

  public formNotValid: boolean;

  constructor(
    private _userService: UserService,
    private _router: Router
  ) { 

  }

  ngOnInit() {
  }

  public sendLoginForm() {
    if(!this.email || !this.password){
      this.formNotValid = true;
      this.feedbackMessage = "Both fields are required to login!";
      return false;
    }

    const user = {
      email: this.email,
      password: this.password
    }

    this._userService.auth(user).subscribe(resp => {
      if(!resp.success){
        this.feedbackMessage = resp.message;
        return false;
      }
    });
  }

  public getSelectedOption(option) {
    this.selectedOption = "as " + option;
  }


}

Любая идеябудет оценено.

Ответы [ 5 ]

0 голосов
/ 26 октября 2018

Если вы работаете с разными средами, вы можете настроить их в файлах окружения

Например, ваш evironment.dev.ts будет выглядеть так

export const environment = {
  production: false,
  API_REST_URL: 'https://yourDomainName', // can be http://localhost as well
  API_REST_PORT: 3000
};

И к вашим услугам, вы бы использовали это так

import { environment } from '/path/to/environment';

@Injectable()
export class MyService{
  apiPort = environment['API_REST_PORT'];
  apiUrl = environment['API_REST_URL'];

  constructor(private http: HttpClient) {
  }

  apiCall(): Observable<any> {
    return this.http.get(`${this.apiUrl}:${this.apiPort}/endpoint/path`)
      .pipe(map(data => {
        return data;
      }));
  }
}

А для обслуживания вашего приложения в среде dev вы можете добавить свою команду в scripts object в package.json

 "scripts": {
    ...
    "start-dev": "ng serve --configuration=dev",
    "build:dev": "ng build --configuration=dev",
    ...
  },
0 голосов
/ 26 октября 2018

Отредактируйте ваш сервисный файл:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';

@Injectable()
export class UserService {

  constructor(
    private _httpClient: HttpClient
  ) { }


  public auth(user) {
    return this._httpClient.post('http://localhost:3000/users/login', user).pipe(map((resp: any) => resp.json()));
  }

}

Это может вызвать ошибку CORS по запросу. Чтобы предотвратить это, добавьте этот код в приложение вашего узла в app.js / index.js

app.use((req , res , next) => {

    res.header("Access-Control-Allow-Origin" , "*");
    res.header(
        "Access-Control-Allow-Headers" ,
        "Origin, X-Requested-With, Content-Type, Accept, Authorization"
    );
    next();

});
0 голосов
/ 26 октября 2018

Вы можете просто использовать полный URL в вашем звонке, как это

this._httpClient.post(window.location.protocol + '//' + window.location.hostname + ':3000/' + 'users/login', user)

В идеале вы должны иметь свои микроуслуги за обратным прокси-сервером и направлять свои запросы на основе путей URI

0 голосов
/ 26 октября 2018

Вы можете попробовать поместить URL-адрес для вызовов API в переменную, а затем добавить его в URL-адрес глаголов http с указанием конкретного маршрута.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';

@Injectable()
export class UserService {
url='http://localhost:3000/'
  constructor(
    private _httpClient: HttpClient
  ) { }


  public auth(user) {
    return this._httpClient.post(this.url+'users/login', user).pipe(map((resp: any) => resp.json()));
  }

}
0 голосов
/ 26 октября 2018

Вы должны настроить прокси в Angular ng serve для перенаправления запросов к вашему API.Измените package.json для запуска ng serve с параметрами:

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

и создайте proxy.config.json для пересылки запросов в ваш бэкэнд, например, при условии, что ваш бэкэнд работает на той же машине и через порт 3000:

{
  "/api/*": {
   "target": "http://localhost:3000",
   "secure": false
  },
  "/__/*": {
    "target": "http://localhost:3100",
    "secure": false
  }
}

Я полагаю, что это можно настроить и в angular.json, однако никогда не рассматривал эту опцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...