2016-08-23 2 views
0

У меня есть сторона аутентификации на моем приложении, работающая с использованием passport. Это даст мне 403, когда пользователь не имеет доступа к определенному маршруту, в том числе и маршруты api.React reroute on ajax call

т.е.

app.use('/api/calendar', passport, authorize([roles.SOME_ROLE]), calendar); 

позже я называю этот api/calendar маршрут, чтобы получить календарь так:

var getAll = function() { 
    return $.get(routes.MAIN + routes.GET_CALENDAR) 
      .error(function(error) { 
       //this is where I am stuck 
      }); 
} 

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

Обратите внимание, что этот файл является файлом службы, метод getAll вызывается из React компонента:

loadCalendar: function() { 
      var self = this; 
      calendarService.getAll() 
       .then(function (data) { 
        self.props.load(data); 
       }); 
     }, 

Я знаю, что я мог бы сделать это в этой loadCalendar функции, но это означало бы, что в любое время я делаю звоните в любую службу, мне нужно включить блок error, и я предпочел бы, чтобы он был централизован в файлах service.

ответ

0

Так что для людей, пытающихся понять это, я нашел его некоторое время назад.

Прежде всего, вы должны иметь Router в своем React компоненте.

var withRouter = require('react-router').withRouter; 
var SomeComponent = withRouter(
    React.createClass({ 
     PropTypes: { 
     }, 
     ......... 

Далее мы настроим наш сервис, чтобы быть в состоянии назвать Router:

var router = null; 
var setRouter = function (routerToSet) { 
    router = routerToSet; 
} 
//..... other stuff 

module.exports: { 
//..... 
setRouter: setRouter 
} 

Теперь мы можем назвать - на Ajax ошибки - маршрутизатор для перенаправления

function handleErrorResponse(error, router) { 
    if(error.status == statusCodes.UNAUTHORIZED) { 
     if(router) { 
      router.replace(unauthorizedPath); 
     } 
     else { 
      toastr.error("Router not defined", "CRITICAL ERROR"); 
      throw new Exception("CRITICAL ERROR: Router not defined");    
     } 
    } 
    else { 
     return error; 
    } 
} 


function handleError(error) { 
    return handleErrorResponse(error, router); 
} 

var myAjaxCallToHandle= function() {  
    return $.ajax({ 
     url: routes.where_ever, 
     data: JSON.stringify(data), 
     method: "POST", 
     contentType: "application/json" 
    }) 
    .error(handleError); 
} 

единственное, что осталось сделать, в компоненте, пара Router

//......... 
     getInitialState: function() { 
      unitPlantService.setRouter(this.props.router); 
     } 
//.........