角度路线导致404 - 无法获得GET

时间:2015-02-27 16:19:43

标签: javascript angularjs angular-ui-router

我尝试使用angulars ui-router设置网址,以便我可以转到基本网址或转到相同的基本网址+参数。所以 - 我可以去/ test或/ test / 1,它会转到同一页面 - 唯一的区别是url参数。所以到目前为止我有这个:

 .state('test', {
    url: '/test',
    templateUrl: 'views/test.html',
    controller: 'testCtrl'
})
.state('testState', {
    url: '/test/:id',
    templateUrl: 'views/test.html',
    controller: 'testCtrl'
});

/test似乎工作正常,但当我输入test/1时,它会显示cannot GET。这是因为我手动键入url而不是使用ui-routers内​​部链接(ui-sref)。我这样说是因为我注意到当我输入/test时,它也是同样的事情。但是,当我使用ui-sref设置的页面上的链接时,测试和主页点击工作正常。我希望能够共享test/:id的网址,因为这将是一个人们登录的网络应用可以共享链接。

此外 - 是否有更好的方法将测试和testState设置为1状态?谢谢!

2 个答案:

答案 0 :(得分:1)

您的问题不在Angular方面,而在于您的服务器(节点我根据响应措辞进行猜测)。节点/表达/不知道哪个文件要服务于test / 1。尝试放宽您的路由方案。我的意思是,设置代码,以便任何请求,例如test*解析为与test/相同的文件。以下是快递应用中的一个示例:

/**
 * For any GET that we can't resolve to a static file, assume it's 
 * an attempt to go to an angular route
 */
app.get('*', function(req, res){
  res.sendfile(path_to_indexfile);
});

更新(讨论后):

或者您可以关闭html5模式 - 然后您不必担心告诉您的服务器如何处理/test/1 - angular会使用/test/#!/1这不应该是{\ n}导致问题。

答案 1 :(得分:1)

有两种选择,使用一种状态" / test /:id"然后参数是可选的你可以调用/ test / 1或/ test /.

如果你想启用/测试,你需要另一个州。

这是一个包含所有选项的Plunker。 正如AlexMA所提到的那样,您似乎没有发布有问题的代码,所以我无法修复您的示例。

此配置适用于您的请求:

.config(function($stateProvider, $urlRouterProvider) {

  $urlRouterProvider.otherwise('/');

  $stateProvider
    .state('view', {
            url: '/view/:inboxId',
            templateUrl: 'tpl.view.html',
            controller: 'viewCtrl'
        }).

        state('view_root', {
            url: '/view',
            templateUrl: 'tpl.view.html',
            controller: 'viewCtrl'
        })

})
.controller('viewCtrl', function($scope, $state, $stateParams) {
  $scope.state = $state.current;
  $scope.params = $stateParams;
})