Не удается получить ответ сервера в службе защиты маршрутов - PullRequest
0 голосов
/ 06 июля 2018

Я использую Angular 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, содержащий 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); я вижу

<code>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
↵ ↵ ↵ ", status: 404, ok: false, statusText:« Not Found », заголовки: Headers,…}

Я в замешательстве. Как я могу получить ответ от сервера?

Спасибо

EDIT

Вот весь код промежуточного программного обеспечения узла, который проверяет токены и отправляет обратно JSON службе защиты угловых маршрутов

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});}
    });
  }
}

Я использую промежуточное программное обеспечение как таковое

router.get('/', validate.required(), (req, res)=>{...

РЕДАКТИРОВАТЬ 2

Я добавил простые 'Content-Type','application/json' заголовки в функцию showRes. Нет прогресса.

Также странно то, что когда я щелкаю по защищенному маршруту, он перенаправляет меня обратно на страницу входа в систему, как и должно быть, в строке URL-адреса, которую я вижу http://localhost:4200/cms/login, страница входа в систему появляется, как и должна, но ошибки о страница входа

<code>GET http://localhost:4200/cms/login 404 (Not Found)
ERROR Response {_body: "<!DOCTYPE html>↵<html lang="en">↵<head>↵<meta char…<pre>Cannot GET /cms/login
↵ ↵ ↵ ", status: 404, ok: false, statusText:« Not Found », заголовки: Headers,…} Ошибка загрузки XHR: GET "http://localhost:4200/cms/login".

1 Ответ

0 голосов
/ 06 июля 2018
  1. Убедитесь, что конечная точка веб-сервера localhost работает должным образом , т. Е.
    • а. Убедитесь, что конечная точка возвращает JSON
    • б. Убедитесь, что сервер http работает (верните 200 (OK)) и не возвращает сообщений об ошибках (обычно 400, 403, 404 из-за неправильных заголовков, ограничений безопасности или NotFound, как в вашем случае)

Из того, что я вижу, ваш API не возвращает ожидаемые данные JSON токена (сервер возвращает 404 Not Found, что является причиной ошибки 404 при запросе от http://localhost:4200/cms/login, и похоже, что ваша последующая subscribe((data) => и функциональность не работает.

<code>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
↵ ↵ ↵ ", status: 404, ok: false, statusText:« Not Found », заголовки: Headers,…}

Похоже, вы получаете ошибку по умолчанию 404 ошибка html страница {_body: "<!DOCTYPE html> ... }

Вот пример ошибки 404 https://stackoverflow.com/questions/thisPageDoesn'tExistSo404Error

Edit:

В прямой ответ на ваш вопрос

Я в замешательстве. Как я могу получить ответ от сервера?

Возможно, конечная точка сервера настроена неправильно. Если из-за этого возникли дополнительные проблемы, прокомментируйте или отредактируйте, и я с удовольствием уточню.

См. Утилита Postman для тестирования и разработки API: https://www.getpostman.com/

Рекомендации для получения дополнительной информации:

Стилистические предпочтения:

  • Параметризованные функции с явными типами возврата. (Это TypeScript! так что используйте функциональность TypeScript для лучшего кода!)
  • Разбейте ваши вызовы функций на самодокументированные куски в переменных const : explicitType
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...