在路由保护服务中无法获得服务器响应

时间:2018-07-05 22:26:37

标签: angular routes angular6

我正在使用角度6,并根据节点的响应和令牌的到期日期创建了一个服务来保护某些路由。

因此,在我的工作服务中,它检查令牌是否过期,我添加了以下功能,该功能还可以检查服务器响应。

import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor (
    private authService:AuthService,
    private router:Router,
    private http: HttpClient
  ){}

  canActivate(){
    if(this.authService.tokenExpired()) {
      //added this >>
      this.authService.showRes().subscribe((data) =>
      {
        console.log('URL DDATA',data);
      });
      //<< added this
      this.router.navigate(['/cms/login']);
      return false;
    } else {
      return true;
    }
  }

}

包含auth的{​​{1}}服务具有

showRes

showRes(){ return this.http.get(this.router.url).pipe(map(res => res.json())); } 中,我像这样app.module使用该服务

,如果用户未登录,则节点以{path:'cms/profile',component:ProfileComponent,canActivate:[AuthGuard] }

响应

角度路线服务不允许我使用它的轮廓。但是它没有得到服务器响应。

我看到

而不是returnres.json({redirect:true});
console.log('URL DDATA',data);

我很困惑。如何获得服务器响应?

谢谢

编辑

这是节点中间件的全部代码,用于检查令牌并将JSON发送回角度路由保护服务

GET http://localhost:4200/cms/login 404 (Not Found)
XHR failed loading: GET "http://localhost:4200/cms/login".
ERROR Response {_body: "<!DOCTYPE html>↵<html lang="en">↵<head>↵<meta char…<pre>Cannot GET /cms/login</pre>↵</body>↵</html>↵", status: 404, ok: false, statusText: "Not Found", headers: Headers, …}

我就这样使用中间件

const jwt = require('jsonwebtoken'); const user = require('../db'); const config = require('../db/config'); exports.required = ()=>{ return (req, res,next)=>{ const token = req.get('Authorization'); const key = config.key; jwt.verify(token, key,function(err, decoded) { if (err){ return res.json({redirect:true});} if (decoded){ let dateNow = Math.floor(Date.now() / 1000); if (dateNow > decoded.exp){ return res.json({redirect:true});} next(); } else { return res.json({redirect:true});} }); } }

编辑2

我向router.get('/', validate.required(), (req, res)=>{...函数添加了简单的'Content-Type','application/json'标头。没有进展。

同样奇怪的是,当我单击一条受保护的路由时,它会将我重定向到登录页面,在网址栏中,我看到showRes,登录页面会按原样显示,但是会出现错误关于登录页面

http://localhost:4200/cms/login

1 个答案:

答案 0 :(得分:1)

  1. 验证您的localhost Web服务器端点是否按预期工作,即:
    • a。检查端点是否返回JSON
    • b。检查HTTP服务器是否正在运行(返回200 (OK)),并且由于不正确的标头,安全限制或{{而返回错误消息(Commonly,400403404) 1}},具体取决于您的情况

据我所知,您的API未返回预期的令牌JSON数据(服务器返回NotFound,这是当您从404 Not Found请求时出现404错误的原因,并且这就是为什么您随后的http://localhost:4200/cms/login和功能失败。

subscribe((data) =>

您似乎收到了默认的GET http://localhost:4200/cms/login 404 (Not Found) XHR failed loading: GET "http://localhost:4200/cms/login". ERROR Response {_body: "<!DOCTYPE html>↵<html lang="en">↵<head>↵<meta char…<pre>Cannot GET /cms/login</pre>↵</body>↵</html>↵", status: 404, ok: false, statusText: "Not Found", headers: Headers, …} 错误404页面html

Here's an example of a 404 error https://stackoverflow.com/questions/thisPageDoesn'tExistSo404Error

编辑:

直接回答您的问题

  

我很困惑。如何获得服务器响应?

您的服务器端点可能配置不正确。 如果此后还有其他问题,请评论或编辑,我很乐意详述。

请参见Postman utility for API testing and development: https://www.getpostman.com/

更多信息的参考文献:

风格偏好:

  • 具有显式返回类型的参数化函数。 (这是TypeScript! 因此可以利用TypeScript功能获得更好的代码!)
  • 将函数调用分解为变量{_body: "<!DOCTYPE html> ... } const中的自记录块