【问题标题】:Angular 4 Http interceptor ,, i am geting an error at the time of "ng serve"Angular 4 Http拦截器,我在“ng serve”时遇到错误
【发布时间】:2017-07-25 05:12:24
【问题描述】:

错误中的错误遇到静态解析符号值。 不支持函数调用。考虑更换功能或 lambda 引用导出的函数(位置 69:19 在 原始 .ts 文件),解析符号 AppModule 在 /src/app/app.module.ts

HttpService.js

import {Injectable} from '@angular/core';
import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from '@angular/http';
import {Observable} from 'rxjs/Observable';

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable()
export class HttpService extends Http {
   constructor(backend: XHRBackend, options: RequestOptions) {
    let token = localStorage.user_token; // your custom token getter function here
    options.headers.set('token', `${token}`);
    super(backend, options);
  }

  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    let token =  localStorage.user_token;
    if (typeof url === 'string') { // meaning we have to add the token to the options, not in url
      if (!options) {
        // let's make option object
        options = {headers: new Headers()};
      }
      options.headers.set('token', `${token}`);
    } else {
      // we have to add the token to the url object
      url.headers.set('token', `${token}`);
    }
    return super.request(url, options).catch(this.catchAuthError(this));
  }

  private catchAuthError(self: HttpService) {
    // we have to pass HttpService's own instance here as `self`
    return (res: Response) => {
      console.log(res);
      if (res.status === 401 || res.status === 403) {
        // if not authenticated
        console.log(res);
      }
      return Observable.throw(res);
    };
  }
}

app.module.js

providers: [
    {
      provide: HttpService,
      useFactory: (backend: XHRBackend, options: RequestOptions) => {
        return new HttpService(backend, options);
      },
      deps: [XHRBackend, RequestOptions]
    },
    UserService,CookieService,ProductService,ConfirmationService,AuthGaurdService,

  ]

【问题讨论】:

    标签: angular http interceptor


    【解决方案1】:

    由于错误状态考虑将 lambda 替换为对导出函数的引用,例如:

    export function httpServiceFactory(backend: XHRBackend, options: RequestOptions) {
      return new HttpService(backend, options);
    }
    

    现在您的提供者应该如下所示:

    {
      provide: HttpService,
      useFactory: httpServiceFactory,
      deps: [XHRBackend, RequestOptions]
    },
    

    【讨论】:

    • thnaks yurzui ,现在错误消失了,但出现了新错误
    • ERROR 错误:未捕获(承诺中):TypeError:无法设置未定义的属性“backend”类型错误:无法在 Http 处设置未定义的属性“_backend”(http.es5.js:1892 ) 在 HttpService (http-service.service.ts:13) 在 _callFactory (core.es5.js:9548) 在 _createProviderInstance$1 (core.es5.js:9487) 在 resolveNgModuleDep (core.es5.js:9469) 在 _createClass (core.es5.js:9512) 在 _createProviderInstance$1 (core.es5.js:9484) 在 resolveNgModuleDep (core.es5.js:9469) 在 NgModuleRef.webpackJsonp.../../../核心/@ang
    • 你的 AppModule 中是否导入了 HttpModule?
    • 是的,我有 import import {Http, HttpModule , RequestOptions, XHRBackend } from '@angular/http';但是由于这个构造函数而出错(后端:XHRBackend,选项:RequestOptions)
    猜你喜欢
    • 2017-11-07
    • 2018-05-19
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2023-03-13
    • 2018-03-30
    相关资源
    最近更新 更多