【问题标题】:Type Headers is not assignable to type HttpHeaders in TypeScript and Angular 9Type Headers 不能分配给 TypeScript 和 Angular 9 中的类型 HttpHeaders
【发布时间】:2021-04-18 21:24:12
【问题描述】:

我是TypeScript 的新手,正在学习做一个简单的身份验证教程。后端我使用Express,前端我使用Angular 9。我对错误进行了很多研究,因为网上有很好的资源,但我不明白为什么没有一个适用于我的案例。

我收到以下错误:

错误:src/app/services/auth.service.ts:19:79 - 错误 TS2769:否 重载匹配这个调用。最后一个重载给出了以下 错误。 类型 'Headers' 不可分配给类型 'HttpHeaders | { [标题:字符串]:字符串 |细绳[]; } |不明确的'。 类型 'Headers' 不可分配给类型 '{ [header: string]: string |细绳[]; }'。 “标头”类型中缺少索引签名。

19 返回 this.httpCient.post('http://localhost:3000/users/register', 用户, {headers: headers}).pipe(map(res => res));

所以在registerUser(user)authenticate(user) 这两个函数上,错误似乎都在这一行:

return this.httpCient.post('http://localhost:3000/users/authenticate', user, {headers: headers}).pipe(map(res => res));

在导致问题的代码下方:

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

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  authToken: any;
  user: any;

  constructor(private httpClient: HttpClient) { }


  registerUser(user) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return this.httpClient.post('http://localhost:3000/users/register', user, {headers: headers}).pipe(map(res => res));
  }

  authenticateUser(user) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return this.httpClient.post('http://localhost:3000/users/authenticate', user, {headers: headers}).pipe(map(res => res));
  }
}

我找到了this post 来帮助我解决问题,但是没有用,因为我使用的是Angular 9,而http 模块现在被'@angular/common/http'; 中的HttpClient, HttpHeaders 替换。所以我能够跟随并部分解决它。

This 作为一般知识也很有用,但它处理 Angular 2 并且找不到有用的答案。

如果有人遇到同样的错误,请分享解决方法。

【问题讨论】:

    标签: angular typescript postman


    【解决方案1】:

    HttpClient 需要 HttpHeaders 作为参数。 (Headers 对象是在引入 HttpClient 之前使用的,它与 HttpClient 不兼容。)因此例如以下可以工作:

    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type':  'application/json'
    });
    return this.httpClient.post('http://localhost:3000/users/authenticate', user, httpOptions);
    

    在此处查看更多详细信息和示例: https://angular.io/guide/http#adding-headers

    不要忘记订阅返回的Observable,否则请求将不会发送。 (Observables 是惰性的。)

    【讨论】:

    • 谢谢,我知道发生了什么。您能否解释一下“不要忘记订阅返回的 Observable”以处理请求的含义?感谢您的宝贵时间。
    • registerUserauthenticateUser 函数返回一个 RxJS Observable 因为 HttpClient 的方法返回它。如果您有Observable,则需要订阅它,例如:observable.subscribe(x => console.log(x));。如果没有订阅 Observable,则不会执行其逻辑。在此处查看有关Observables 的详细信息:rxjs-dev.firebaseapp.com/guide/observable
    • 如果您订阅了Observable 对象,请不要忘记取消订阅它们以避免潜在的内存泄漏。在此处查看有关此主题的精彩摘要:medium.com/angular-in-depth/…
    • 完美!感谢您的时间!现在很清楚了。
    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 2019-05-21
    • 1970-01-01
    • 2022-07-27
    • 2022-11-15
    • 2021-05-14
    • 2020-08-04
    • 2021-08-05
    相关资源
    最近更新 更多