Тип проблемы угловой службы строка | null

#javascript #json #angular #api #rest

#язык JavaScript #json #угловой #API #остальное

Вопрос:

У меня эта проблема с моим кодом angular, и, кстати, я использую angular 13 для своего приложения. проблема в том, что при вызове служб я пытаюсь вызвать пользовательский api с серверной части и все время сталкиваюсь с этой проблемой. Я много искал и пробовал все, чтобы это сработало, но без какого-либо решения. это код ниже: это пользовательский сервис:

 import { HttpClient, HttpResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { JwtHelperService } from '@auth0/angular-jwt'; import { environment } from 'src/environments/environment'; import { User } from "../module/user";  @Injectable({providedIn: 'root'}) export class UserService {  public apiUrl = environment.apiUrl;  private jwtHelper = new JwtHelperService();   constructor(private http: HttpClient) {}   login(user: User): Observablelt;HttpResponselt;Usergt;gt; {  return this.http.postlt;Usergt;(`${this.apiUrl}/user/login`, user, { observe: 'response'});  }   register(user: User): Observablelt;HttpResponselt;Usergt;gt; {  return this.http.postlt;Usergt;(`${this.apiUrl}/user/register`, user, { observe: 'response'});  }   updateUser(formData: FormData): Observablelt;Usergt; {  return this.http.postlt;Usergt;(`${this.apiUrl}/user/update`, formData);  }   deleteUser(username: string): Observablelt;anygt; {  return this.http.deletelt;anygt;(`${this.apiUrl}/user/delete/${username}`);  }   addUserToCache(user: User): void {  localStorage.setItem('user', JSON.stringify(user));  }   getUserFromCache(): User {  return JSON.parse(localStorage.getItem('user'));  }   addTokenToCache(token: string): void {  localStorage.setItem('token', token);  }   getTokenFromCache(): string {  return localStorage.getItem('token');  }   logOut(): void {  localStorage.removeItem('user');  localStorage.removeItem('token');  }   getTokenExpirationDate(): Date | null {  return this.jwtHelper.getTokenExpirationDate(this.getTokenFromCache());  }   isUserLoggedIn(): boolean {  if (this.getTokenFromCache() amp;amp; this.getUserFromCache() amp;amp;  this.jwtHelper.decodeToken(this.getTokenFromCache()).sub amp;amp;  !this.jwtHelper.isTokenExpired(this.getTokenFromCache())) {  return true;  } else {  this.logOut();  return false;  }  }   createUserFormData(currentUsername: string, user: User): FormData {  const formData = new FormData();  formData.append('currentUsername', currentUsername);  formData.append('username', user.username);  formData.append('email', user.email);  formData.append('role', user.role);  formData.append('isActive', JSON.stringify(user.active));  formData.append('isNonLocked', JSON.stringify(user.notLocked));  return formData;  } }   

это данные пользователя

 export class User {  constructor(  public id = 0,  public userId = '',  public username = '',  public email = '',  public lastLoginDate = null,  public logInDateDisplay = null,  public joinDate = null,  public active = true,  public notLocked = true,  public role = '',  public authorities = []) {}  }   

это ошибка, показанная мне:

 Error: src/app/role/admin/admin.component.ts:15:22 - error TS2339: Property 'getAdmin' does not exist on type 'UserService'.  15 this.userService.getAdmin().subscribe(  ~~~~~~~~   Error: src/app/role/admin/admin.component.ts:16:7 - error TS7006: Parameter 'data' implicitly has an 'any' type.  16 data =gt; {  ~~~~   Error: src/app/role/admin/admin.component.ts:19:7 - error TS7006: Parameter 'err' implicitly has an 'any' type.  19 err =gt; {  ~~~   Error: src/app/service/user.service.ts:36:23 - error TS2345: Argument of type 'string | null' is not assignable to parameter of type 'string'.  Type 'null' is not assignable to type 'string'.  36 return JSON.parse(localStorage.getItem('user'));  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~   Error: src/app/service/user.service.ts:44:5 - error TS2322: Type 'string | null' is not assignable to type 'string'.  Type 'null' is not assignable to type 'string'.  44 return localStorage.getItem('token');  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     ** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **   ✖ Failed to compile. ✔ Browser application bundle generation complete.  5 unchanged chunks  Build at: 2021-11-29T07:19:50.781Z - Hash: 1847dd9fe6fe2628 - Time: 350ms  Error: src/app/role/admin/admin.component.ts:15:22 - error TS2339: Property 'getAdmin' does not exist on type 'UserService'.  15 this.userService.getAdmin().subscribe(  ~~~~~~~~   Error: src/app/role/admin/admin.component.ts:16:7 - error TS7006: Parameter 'data' implicitly has an 'any' type.  16 data =gt; {  ~~~~   Error: src/app/role/admin/admin.component.ts:19:7 - error TS7006: Parameter 'err' implicitly has an 'any' type.  19 err =gt; {  ~~~   Error: src/app/service/user.service.ts:36:23 - error TS2345: Argument of type 'string | null' is not assignable to parameter of type 'string'.  Type 'null' is not assignable to type 'string'.  36 return JSON.parse(localStorage.getItem('user'));  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~   Error: src/app/service/user.service.ts:44:5 - error TS2322: Type 'string | null' is not assignable to type 'string'.  Type 'null' is not assignable to type 'string'.  44 return localStorage.getItem('token');  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     ✖ Failed to compile.    

Комментарии:

1. в getAdmin() предоставленном вами коде нет функции, и это также первая ошибка, которую вы получаете.

Ответ №1:

в службе нет функции, которая называется

getAdmin()

реализуйте функцию в службе до ее вызова.

Ответ №2:

Попробуйте это

 return localStorage.getItem('token') || '';  

Это решит только проблему компилятора tsc.

Комментарии:

1. Было бы лучше объяснить, почему это действительно необходимо.

Ответ №3:

это правильно, когда вы берете элемент из локального хранилища, возвращаемый тип равен нулю или строке,

 getItem(key: string): string | null;  

и вы не можете разобрать null, прежде JSON.parse чем вы должны убедиться, что элемент присутствует, и вы получите его

Ответ №4:

попробуйте использовать любой вместо пользователя в качестве ссылки, чтобы это помогло вам получить объект

getUserFromCache(): any { return JSON.parse(localStorage.getItem('user')); }

пожалуйста, сначала напишите функцию getAdmin() в классе UserService, чтобы решить эту проблему