Ошибка типа: токен.разделение не является функцией

#node.js #angular #jwt-auth

#node.js #угловой #jwt-auth

Вопрос:

При входе в систему я получаю некоторую ошибку, которая не ожидается, но я пытаюсь решить ее через 2 дня, но не могу. Я использую Nodejs для api и angular 7 для интерфейса

я опубликовал часть кода с ошибкой, пожалуйста, помогите мне решить эту проблему ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО

auth.service.ts

 import { Injectable } from "@angular/core";
import { Observable } from "rxjs";
import "rxjs/Rx";
import { JwtHelperService } from "@auth0/angular-jwt";
import "core-js/es7/reflect";

import { HttpClient } from "@angular/common/http";

const jwt = new JwtHelperService();
@Injectable()
export class AuthService {
  private decodedToken;
  constructor(private http: HttpClient) {}
  public register(userData: any): Observable<any> {
    return this.http.post("/api/v1/users/register", userData);
  }
  public login(userData: any): Observable<any> {
    return this.http.post("/api/v1/users/auth", userData).map(token => {
      //debugger;
      return this.saveToken(token);
    });
  }

  private saveToken(token): string {
    //debugger;
    this.decodedToken = jwt.decodeToken(token);
    localStorage.setItem("bwm_auth", token.token);
    localStorage.setItem("bwm_meta", JSON.stringify(this.decodedToken));
    return token;
  }
}
  

login.component.ts

 import { Component, OnInit } from "@angular/core";
import { Router, ActivatedRoute } from "@angular/router";
import { AuthService } from "../shared/auth.service";
import { FormBuilder, FormGroup, Validators } from "@angular/forms";

@Component({
  selector: "bwm-login",
  templateUrl: "./login.component.html",
  styleUrls: ["./login.component.scss"]
})
export class LoginComponent implements OnInit {
  loginForm: FormGroup;
  mistake: any[] = [];
  notifyMessage: string = "";
  constructor(
    private fb: FormBuilder,
    private auth: AuthService,
    private router: Router,
    private route: ActivatedRoute
  ) {}

  ngOnInit() {
    this.initForm();
    this.route.params.subscribe(params => {
      if (params["registered"] == "success") {
        //debugger;
        this.notifyMessage =
          "You have been successfully registered you can login now";
      }
    });
  }
  initForm() {
    this.loginForm = this.fb.group({
      email: [
        "",
        [
          Validators.required,
          Validators.pattern(
            "^[a-zA-Z0-9.!#$%amp;’* /=?^_`{|}~-] @[a-zA-Z0-9-] (?:.[a-zA-Z0-9-] )*$"
          )
        ]
      ],
      password: ["", Validators.required]
    });
  }
  isInvalidForm(fieldName): boolean {
    return (
      this.loginForm.controls[fieldName].invalid amp;amp;
      (this.loginForm.controls[fieldName].dirty ||
        this.loginForm.controls[fieldName].touched)
    );
  }
  isRequiredForm(fieldName): boolean {
    return this.loginForm.controls[fieldName].errors.required;
  }
  login() {
    // debugger;

    //console.log(this.loginForm.value);
    this.auth.login(this.loginForm.value).subscribe(
      token => {
        //debugger;
        this.router.navigate(["/rentals"]);
      },
      errorResponse => {
        // debugger;
        console.log(errorResponse);
        // this.mistake = errorResponse.error.errors;
        //this.mistake = errorResponse.error;
      }
    );
  }
}
  

ошибка в браузере

 TypeError: token.split is not a function
    at JwtHelperService.push../node_modules/@auth0/angular-jwt/src/jwthelper.service.js.JwtHelperService.decodeToken (jwthelper.service.js:70)
    at AuthService.push../src/app/auth/shared/auth.service.ts.AuthService.saveToken (auth.service.ts:26)
    at MapSubscriber.project (auth.service.ts:20)
    at MapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:35)
    at MapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at MapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:41)
    at MapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at FilterSubscriber.push../node_modules/rxjs/_esm5/internal/operators/filter.js.FilterSubscriber._next (filter.js:38)
    at FilterSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber.notifyNext (mergeMap.js:84)
  

ошибка в браузере

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

1. this.decodedToken = jwt.decodeToken(token.token); похоже, это решит проблему, здесь вы передавали весь объект вместо токена в приведенном выше коде

Ответ №1:

Как кажется, токен, возвращаемый с сервера, не имеет строкового типа

 public login(userData: any): Observable<any> {
    return this.http.post("/api/v1/users/auth", userData).map(token => {
      //debugger;
      return this.saveToken(token);
    });
  }
  

попробуйте проверить, что возвращается с сервера

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

1. поскольку он использует объект token , вместо этого он должен был использовать token.token в строке 26