Получение токена заголовка как неопределенного - PullRequest
0 голосов
/ 27 апреля 2020

Привет, ребята. В настоящее время я работаю над простым singup и singin кодом с Angular для внешнего интерфейса и Express, Typescript, JWT и Mongodb для API REST.

Когда я отправляю метод post на Почтальоне он дает мне заголовок с токеном, но когда я отправляю метод post через клиентскую часть, я получаю заголовок с токеном как неопределенный и не знаю почему, не могли бы вы мне помочь?

Вот мой код

Auth.service.ts

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

import { AuthService } from '../../services/auth.service';


@Component({
  selector: 'app-registrar',
  templateUrl: './registrar.component.html',
  styleUrls: ['./registrar.component.css']
})
export class RegistrarComponent implements OnInit {


  user = {
    username: '',
    email: '',
    password: ''
  };

  constructor(private authService: AuthService) { }

  ngOnInit(): void {
  }

  registrar(){
    this.authService.registrar(this.user)
      .subscribe(
        res => {
          console.log(res.token);
          // localStorage.setItem('token', res['token']);
        },
        err => console.log(err)
      );
  }

}

Registrar.component.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  private URL = 'http://localhost:3000/api/auth/';

  constructor(private http: HttpClient) { }

  registrar(user){
    return this.http.post<any>(this.URL + 'registrar', user);
  }

}

Auth.controller.ts - API REST

import { Request, Response } from 'express';
import User, { IUser } from '../models/user';
import jwt from 'jsonwebtoken';

export const registrar = async (req: Request, res: Response) => {
   console.log(req.body);
   const user: IUser = new User ({
      username: req.body.username,
      email: req.body.email,
      password: req.body.password
   });
   user.password = await user.encriptarPassword(user.password);
   const usuarioGuardado = await user.save();

   const token: string = jwt.sign({_id: usuarioGuardado._id}, process.env.TOKEN_SECRET || 'secretKey');

   res.header('Token', token).json(usuarioGuardado);
};

export const logear = async (req: Request, res: Response) => {
   const user = await User.findOne({email: req.body.email});
   if (!user) return res.status(400).json('El email es incorrecto');

   const claveCorrecta: boolean = await user.validarPassword(req.body.password);
   if (!claveCorrecta) return res.status(400).json('La contraseña es incorrecta');

   const token: string = jwt.sign({_id: user._id}, process.env.TOKEN_SECRET || 'secretKey', {
      expiresIn: 60 * 60 * 24
   });

   res.header('token', token).json(user);
};

export const perfil = async (req: Request, res: Response) => {
   const user = await User.findById(req.userId, { password: 0 });
   if (!user) return res.status(404).json('Usuario no encontrado');
   res.json(user);
};

Вот пи c console.log (res.token)

1 Ответ

0 голосов
/ 27 апреля 2020

Поскольку вы отправляете токен в качестве заголовка, вам нужно прочитать заголовки на стороне клиента.

Изменить ваш сервис registrar метод, чтобы он возвращал весь ответ (поэтому заголовки и тело)

return this.http.post<any>(this.URL + 'registrar', user, { observe: 'response'});

А затем в вашем компоненте

this.authService.registrar(this.user)
  .subscribe(        resp => {
   let token = resp.headers.get('token');
   let user = resp.body
  });

Для быстрого исправления вы также можете просто добавить токен на стороне сервера тела.

...