Приложение локально обрабатывает сторонний сервис отдыха, но не работает при запуске контейнера Docker - PullRequest
0 голосов
/ 25 января 2019

У меня есть приложение Angular, которое делает вызовы REST стороннему REST-сервису.Думайте об этом сервисе как о www.someothercompany/restapi/MyObject/1.

Когда я запускаю свое приложение локально (через ng serve), мое приложение может выполнять вызовы этой службы.

Когда я создаю свой контейнер локально и запускаю свой контейнер локально, мое приложение не работа со службой.

Итак, я попытался отладить его, я создал окно терминала в локальном работающем контейнере (я задокументировал мой «add curl» в Не могу запустить Curlкоманда внутри моего Docker-контейнера )

curl -v --header "Accept: application/json" www.someothercompany/restapi/MyObject/1

и этот вызов работает.

Мой код Angular выглядит следующим образом:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { environment } from  '../../../../environments/environment';
import { MyObjectInfoRequest,MyObjectInfoResponse } from "./myObject-info.model";

@Injectable({ providedIn: 'root' })
export class MyObjectInfoService {


    constructor(private http: HttpClient) {
    }

    getMyObject(myObjectRequest: MyObjectInfoRequest) {
        let headers = new HttpHeaders();
        headers.append('Accept','application/json');
        return this.http.get<MyObjectInfoResponse>(
            environment.myObjectInfoUrl+`?`,
            {
                headers:headers,
                params: { _id: myObjectRequest.id }
            })
            .pipe(map(myObjectInfoResponse => {
                return myObjectInfoResponse;
            }));
    }
}

выглядит http.getкак моя curl команда.

Кто-нибудь видит что-то, что я не правильно делаю?

APPEND:

Мой Dockerfile (построенный в основном из этого примера: Как создать Docker-контейнер для приложения AngularJS? )

FROM node:latest as my-thing-builder
LABEL author="ME"
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build -- --configuration=dev

FROM nginx:alpine
#RUN apk add --no-cache curl
# Install prerequisites
#RUN apt-get update && apt-get install -y curl

VOLUME /tmp/cache/nginx
# support running as arbitrary user which belogs to the root group
RUN chmod -R 777 /var/cache/nginx /var/run /var/log/nginx /var/cache/nginx/
# users are not allowed to listen on priviliged ports
RUN sed -i.bak 's/listen\(.*\)80;/listen 8081;/' /etc/nginx/conf.d/default.conf
EXPOSE 8081
# comment user directive as master process is run as user in OpenShift anyhow
RUN sed -i.bak 's/^user/#user/' /etc/nginx/nginx.conf

COPY --from=my-thing-builder /app/dist /usr/share/nginx/html
COPY ./scaffolding/nginx/nginx.dev /etc/nginx/conf.d/default.conf

CMD ["nginx", "-g","daemon off;"]



#USER 1001
# docker build -t my-thing:dev -f ./scaffolding/docker/my.dockerfile .
# docker run -d -p 8899:8080 my-thing:dev 
# the docker run above will allow local http://localhost:8899/

APPEND

Хорошо .... Я получил некоторые базовые ошибки. Обработка.

Моя исправленная версия.

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { map, catchError } from 'rxjs/operators';
import { Observable, throwError } from 'rxjs';
import { environment } from  '../../../../environments/environment';
import { MyObjectInfoRequest,MyObjectInfoResponse } from "./myObject-info.model";

@Injectable({ providedIn: 'root' })
export class MyObjectInfoService {


    constructor(private http: HttpClient) {
    }

    getMyObject(myObjectRequest: MyObjectInfoRequest) {
        let headers = new HttpHeaders();
        headers.append('Accept','application/json+fhir');
        return this.http.get<MyObjectInfoResponse>(
            environment.myObjectInfoUrl+`?`,
            {
                withCredentials: true,
                headers:headers,
                params: { _id: myObjectRequest.id }
            })
            .pipe(map(myObjectInfoResponse => {
                return myObjectInfoResponse;
            })
            ,
            catchError(err => {
                //console.log(err);
                //alert(err);
                this.handleError(err);
                return throwError(err)
                })            
            );
    }

    private handleError(error: HttpErrorResponse) {
        if (error.error instanceof ErrorEvent) {
          // A client-side or network error occurred. Handle it accordingly.
          //alert('ErrorEvent ' + error.error.message);
          console.error('An error occurred:', error.error.message);
        } else {
          // The backend returned an unsuccessful response code.
          // The response body may contain clues as to what went wrong,
          //alert('Else ' + error.status + ':::' + error.error);
          console.error(
            `Backend returned code ${error.status}, ` +
            `body was: ${error.error}`);
        }
        // return an observable with a user-facing error message
        return throwError(
          'Something bad happened; please try again later.');
      };    
}

==========

Ага!

502

ПлохоШлюз

nginx / 1.15.18

ERROR Object { headers: Object, status: 502, statusText: "Bad Gateway", url: "http://localhost:8899/restapi/MyObject/1", ok: false, name: "HttpErrorResponse", message: "Http failure response for http://localhost:8899/restapi/MyObject/1", error: "<html> <head><title>502 Bad Gateway…" }

1 Ответ

0 голосов
/ 25 января 2019

Хорошо, с помощью комментариев, я смог добавить лучшую обработку ошибок (немного, но я новичок в AngularJS ... так что терпите меня)

Хотя у меня была запись для настройки обратного прокси-сервера, она не была включена.

Так что нужны были некоторые настройки в конфигурации nginx

Как то так: (оригинал)

 location /restapi {
        proxy_pass https://www.someothercompany;
    }

Разрешение (с некоторой помощью коллег) было лучше https setup:

 location /restapi {
    proxy_ssl_server_name on;
    proxy_pass https://www.someothercompany;
    proxy_ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
    proxy_ssl_ciphers             HIGH:!aNULL:!MD5;
    proxy_ssl_session_reuse on;
}

Но он ДЕЙСТВИТЕЛЬНО вел себя не так, как локальный, и не работал в контейнере. Что, конечно, nginx было «разницей» между ними.

Вот странное замечание, о котором я изначально не сообщал. Он работал в контейнере, развернутом в Open-Shift, но он НЕ работал в локальном docker-run. делать то, что ???

Я чувствую себя немного глупо.

Но в то же время я не собираюсь удалять вопрос, потому что я думаю, что мог бы помочь кому-то в будущем.

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