Angular - 连接到代理服务器并获得响应,但随后显示在尝试代理时发生错误:localhost到实际服务器

时间:2017-05-16 16:00:56

标签: angular angular-cli econnreset

我是Angular(2,4)的新手。我试图连接到代理服务器。

在项目根目录

中添加了Either non-empty "srcset" or "src" attribute must be specified:
proxy.config.json

然后在package.json

中的{ "/api/*": { "target": "http://<server_ip_address>:<port>", "secure": false, "changeOrigin": true, "logLevel": "debug" } } 中添加了代理配置
start

现在在组件中我有一个连接到服务器的登录方法。

"scripts": {
        "ng": "ng",
        "start": "ng serve --proxy-config proxy.config.json",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
    },

在身份验证服务中,我有以下代码。

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';

import { AlertService, AuthenticationService } from '../services/index';

@Component({
    moduleId: module.id.toString(),
    templateUrl: 'login.component.html'
})

export class LoginComponent implements OnInit {
    model: any = {};
    loading = false;
    returnUrl: string;

    constructor(
        private route: ActivatedRoute,
        private router: Router,
        private authenticationService: AuthenticationService,
        private alertService: AlertService) { }

    login() {
            this.loading = true;
            this.authenticationService.login(this.model.email, this.model.password)
                .subscribe(data => {
                    localStorage.setItem('currentUser', JSON.stringify(data));
                    this.router.navigate([this.returnUrl]);
                },
                error => {
                    this.alertService.error(error);
                    this.loading = false;
                },
                () => {
                    console.log("Subscribed Else");
                });
        }
}

连接正常。服务器使用正确的JSON数据进行响应。但我可以登录。

真实问题

很奇怪。有时它工作正常,但大多数情况下,即使正确连接到服务器后它也显示问题。服务器使用JSON数据进行响应。然后在终端控制台中显示

[HPM]尝试从localhost:4200代理请求/ api / v1 / login到http://:(ECONNRESET)(https)时出错                 ://nodejs.org/api/errors.html#errors_common_system_errors)

如果我检查Chrome网络控制台,请求的状态为确定。但是在预览选项卡中,它显示来自服务器的JSON,然后附加以下字符串&#34;出现错误试图代理:localhost:4200 / api / v1 / login&#34;

import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';


@Injectable()
export class AuthenticationService {
    headers = new Headers();

    constructor(private http: Http) {
        this.headers.append("Content-Type", "application/json");
    }

    login(email: string, password: string) {
        return this.http.post('/api/v1/login', { email: email, password: password }, { headers: this.headers })
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(response: Response) {
        let user = response.json();
        return user;
    }
    private handleError(error: Response | any) {
        // In a real world app, you might use a remote logging infrastructure
        let errMsg: string;
        let resMsg: string;
        if (error instanceof Response) {
            const body = error.json() || '';
            resMsg = body['message'];
            console.log(body);
            console.log(resMsg);
        } else {
            resMsg = error.message ? error.message : error.toString();
        }
        return Observable.throw(resMsg);
    }
}

因为JSON解析会出错。

为什么问题有时发生而不是总是?什么是实际问题?

P.S。:我使用的是角度 - 4.0.0,angular-cli 1.0.2

2 个答案:

答案 0 :(得分:0)

当您使用Angular CLI时,您正在使用Webpack Dev Server:Link to their Github.您所做的只是将代理文件的路径传递到CLI,然后CLI下载并将其传递到webpack- DEV-服务器。

this issue上,它已报告删除* in&#34; / api / *&#34;可能会解决你的问题。

答案 1 :(得分:0)

我也有这个问题,最后我添加了一个过滤响应的函数:

private parseResponse(response) {
   return JSON.parse(response['_body'].replace(/}Error.*/, '}'))
}

以下是一些参考:

https://github.com/angular/angular-cli/wiki/stories-proxy

https://github.com/angular/angular-cli/issues/889#issuecomment-290112673

希望你能找到更好的解决方案

使用HttpClient代替Http