在ajax调用上重新路由

时间:2016-08-23 09:03:47

标签: reactjs react-router

我的应用程序使用passport进行身份验证。 当用户无法访问特定路由时,这会给我一个403,这也包括api路由。

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个文件中。

1 个答案:

答案 0 :(得分: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);
        }
//.........