【问题标题】:Angularjs routing on an express 4.0 backend API快速 4.0 后端 API 上的 Angularjs 路由
【发布时间】:2014-06-04 08:34:14
【问题描述】:

我已经启动了一个使用 Express 4.0 服务器的应用程序。我已经根据 scotch.io (http://scotch.io/tutorials/javascript/build-a-restful-api-using-node-and-express-4) 上的教程设置了路线,构建了一个后端 api 来服务于前端 SPA (angularjs)。这是后端路由器的摘录:

router.route('/users')
   .get(function (req, res) {
       User.find(function(err, users) {
          if (err) {
             res.send(err);
          }
          else {
             res.json(users);
          }
       });
   })

再往下

// home page route (http://localhost:8080)
router.get('/', function(req, res) {
   res.send('API ROOT');    
});

app.use('/api', router);

从前端我只使用 get 从 api 获取用户:

$http.get('/api/users')
    .success(function(data) {
        $scope.users = data;
});

角度路线是这样设置的:

.when('/', {
    templateUrl: 'views/home.html',
    controller: 'MainController'
})

.when('/users', {
    templateUrl: 'views/user.html',
    controller: 'UserController'
})

index.html 有一个指向 /users 的链接。

启动服务器并进入 localhost:8080 时加载正常,单击用户加载 user.html 视图并列出用户。

但是,如果我在浏览器位于 localhost:8080/users 时单击刷新

我明白了:

Cannot get /users

是控制器问题吗? 还是后端路由有问题?

非常欢迎任何反馈/建议!

再搜索一些,我发现有几种解决方案可以解决这个问题: 在前端(角度路线部分)将其添加到末尾:

// >>> redirect other routes to
otherwise({
    redirectTo: '/'
});

或在后端(在所有路线之后):

app.get('*', function(req, res){
    res.render('index.html');
});

哪种解决方案更好(或者建议同时使用...?)

【问题讨论】:

  • 这实际上是未解决的问题。试试this

标签: javascript node.js angularjs express


【解决方案1】:

你应该同时使用。

您需要为您的 express 应用程序提供一个包罗万象 / 通配符路由,以便任何未明确匹配的路由都将返回索引页面,该页面将加载 Angular 并允许您的 Angular 路由随后接管。请注意,这应该始终是您的最后一条路线(它们按顺序解析)。

app.get('*', function(req, res){
    res.render('index.html');
});

然后在您的 Angular 应用程序中,您应该有一个默认路由来捕获客户端上任何不匹配的路由。如果应用程序已加载但遇到未知路由,则此路由将生效,而上面的服务器端解决方案将处理任何直接请求。

function($routeProvider) {
    $routeProvider.
      when('/', {
        templateUrl: 'home.html',
        controller: 'homeCtrl'
      }).
      otherwise({
        redirectTo: '/'
      });
  }]);

【讨论】:

  • 谢谢。对于 4.0 中的 Express 路由,您可以拥有多个 Router() 实例。我提出的一些后续问题是 1) 是否建议像这样模块化您的路由(例如用于用户,一个用于其他东西,一个用于授权等)还是将所有内容添加到同一个路由器实例中更好? 2)如果你去几个实例,那么你必须在每个路由器实例的末尾添加包罗万象的路由还是只添加最后一个? 3)这是使用sseveral路线的方式:app.use('/api', router); app.use('/', otherRouter);等等?
  • 1.通常,将您的路由分成模块并导出路由器实例是一个好主意。 2. 你只需要一个包罗万象的路线,它应该在你需要其他路线模块之后出现在任何适当的文件中。 3.如果你想在/api路径下挂载router是的,第二种情况你可以使用app.use(otherRouter)
  • 我两个都不用。我在我的角度 app.js 中做了一个包罗万象的事情(否则)——这需要处理所有未处理的路由。不知道我还需要什么情况?
  • Angular 路由只有在你的 Angular 应用程序启动后才能控制。在此之前,您依靠服务器来提供附加了 Angular 脚本的索引页面。如果您的服务器接收到的请求不是针对索引页明确提出的,会发生什么情况?您仍然需要为索引页面提供服务,然后允许 Angular 路由显示适当的视图。这就是为什么您还需要通配符路由服务器端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多