Javascript MEANJS:检查数据库中的url并路由到动态角度状态

Javascript MEANJS:检查数据库中的url并路由到动态角度状态,javascript,angularjs,meanjs,Javascript,Angularjs,Meanjs,上下文 用户可以使用标识其页面的唯一URL slug进行注册,例如“.” 当前状态 在我的Express.js文件中,我成功地检查了我的数据库,以查看用户上是否存在slug,然后将用户从''重定向到'',以利用Angular的路由 然而,对于Angular,我不能在我的路由器文件中使用$http或$location服务(因为它发生在module.config中…有关更多详细信息,请参阅) 欲望 基本上,我想做的是,当找到有效的slug时,将用户路由到“默认”视图,如果找不到,则路由到主视图。如有

上下文 用户可以使用标识其页面的唯一URL slug进行注册,例如“.”

当前状态 在我的Express.js文件中,我成功地检查了我的数据库,以查看用户上是否存在slug,然后将用户''重定向到'',以利用Angular的路由

然而,对于Angular,我不能在我的路由器文件中使用$http或$location服务(因为它发生在module.config中…有关更多详细信息,请参阅)

欲望 基本上,我想做的是,当找到有效的slug时,将用户路由到“默认”视图,如果找不到,则路由到主视图。如有任何建议,将不胜感激

作为参考,我的module.config代码可以在这里找到(请注意,我要使用的“默认”状态是“搜索”):

core.client.routes.js

'use strict';

// Setting up route

    angular.module('core').config(['$stateProvider', '$urlRouterProvider', 
        function($stateProvider, $urlRouterProvider) {

            // Redirect to home when route not found.
            $urlRouterProvider.otherwise('/');

            // Home state routing
            $stateProvider.
            state('home', {
                url: '/',
                templateUrl: 'modules/core/views/home.client.view.html'
            }).
            state('search', {
                url: '/search',
                templateUrl: 'modules/core/views/search.client.view.html'
            });
        }
    ]);
我想做的,是这样的

'use strict';

// Setting up route
angular.module('core').config(['$stateProvider', '$urlRouterProvider', '$http', '$location',
    function($stateProvider, $urlRouterProvider, $http, $location) {

        // Get current slug, assign to json.
        var slug = $location.path();
        var data = {
            link: slug
        };

        // Check db for slug
        $http.post('/my/post/route', data).success( function(response) {
            // Found slug in db
        }).error( function(response) {
            // Route to home
            $location.path('/');
        });

        // Home state routing
        $stateProvider.
        state('home', {
            url: '/',
            templateUrl: 'modules/core/views/home.client.view.html'
        }).
        state('search', {
            // Set URL to slug
            url: '/' + slug,
            templateUrl: 'modules/core/views/search.client.view.html'
        });
    }
]);

要直接回答您的问题,您要做的是使用路由“resolve”检查依赖项并重定向到适当的视图:

angular.module('app',['ui.router','ngMockE2E']))
.run(函数($httpBackend){
$httpBackend.whenGET(/api\/slugs\/.*/).respond(函数(方法,url){
返回url.match(/good$/)?[200,{name:'johndoe'}]:[404',];
});
})
.config(函数($stateProvider){
$stateProvider
.州(
“搜索”,
{
url:“/search?terms=:slug”,
模板:“搜索:{{vm.terms}}”,
controllerAs:'vm',
控制器:函数($stateparms){
this.terms=$stateParams.slug;
}
}
)
.州(
“鼻涕虫”,
{
url:“/:slug”,
模板:“Slug:{{vm.user.name}}”,
controllerAs:'vm',
控制器:功能(用户){
this.user=user
},
决心:{
用户:函数($q、$http、$stateParams、$state){
var defer=$q.defer();
$http.get('http://somewhere.com/api/slugs/'+$stateParams.slug)
.成功(功能(用户){
延迟解析(用户);
})
.错误(函数(){
defer.reject();
$state.go('search',{slug:$stateParams.slug});
});
回报、承诺;
}
}
}
);
});

匹配路线
重定向路由

谢谢您的回复,杰夫。你的建议帮助我对我正在做的一些有问题的事情进行了概念化(我对AngularJS是新手,这是不是很明显?)。我已经大大简化了事情,只是将$http请求完全放在我的控制器中。我还更改了用户从'example.com/#路由到的url/slug“to”example.com/#/搜索/slug'(因为它覆盖了我的所有其他页面,比如/#!/sign等)。再次感谢您的帮助。这也是一个很好的选择: