将标头令牌获取为未定义

Posted

技术标签:

【中文标题】将标头令牌获取为未定义【英文标题】:Getting header Token as Undefined 【发布时间】:2020-08-10 15:20:36 【问题描述】:

大家好,我目前正在使用 Angular 为前端和 Express、Typescript、JWT 和 Mongodb 为 API REST 编写简单的 singup 和 singin 代码。

当我在 Postman 上发送 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);
;

Here is a pic of console.log(res.token)

【问题讨论】:

最简单的解决方案是在用户对象服务器端添加令牌。否则,您需要修改您的角度调用以读取响应标头 你怎么能改变我的角度调用来读取响应头?我将尝试将令牌添加到我的用户对象服务器端,但我该如何在我的角度解决这个问题? 嗨,看看这个帖子:***.com/questions/48184107/… 【参考方案1】:

由于您将令牌作为标头发送,因此您需要在客户端读取标头。

修改您的服务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
  );

为了快速修复,您也可以在正文服务器端添加令牌。

【讨论】:

现在我将 null 作为一个值。获得令牌的最佳方法是什么?作为标头还是在服务器端?在我的服务器端,我只需要向用户添加令牌,对吗?我对这件事很陌生,抱歉 在 chrome 网络调试器中显示响应标头的屏幕截图。最简单的方法是将它添加到用户对象服务器端,然后像以前一样检索它。 试试.get('Token')(大写T)。如果它们不起作用,请检查控制台中是否有任何错误 仍然为 null prntscr.com/s6z7r1 你能告诉我如何将令牌添加到我的对象吗? usuarioGuardado.token = token?

以上是关于将标头令牌获取为未定义的主要内容,如果未能解决你的问题,请参考以下文章

浏览器将经度变量读取为未定义

为啥 Firebug 不为未定义的属性显示“未捕获的类型错误”?

如何将组件属性设置为未定义?

从自定义标头中检索访问令牌

反应:作为道具的数组显示为未定义

为啥从 json 操作中检索到的数据显示为未定义?