在快速服务器上成功调用 api 后,使用 angular 路由重定向页面

redirecting a page with angular routing after successfully calling an api on express server

在使用 angular 路由的单页应用程序中,如何在 api 调用后重定向页面。在我的例子中,我想在用户调用登录 api 后将用户重定向到个人资料页面。所以这就是我认为可行的方法,但事实并非如此。

在客户端,main.js。我设置了 angular 路由

app.config(function($routeProvider){   $routeProvider
//the home page display
.when('/', {
  templateUrl: 'main.html',
  controller: 'mainController'
})

.when('/login', {
  templateUrl: 'login.html',
  controller: 'loginController'
})

.when('/signUp', {
  templateUrl: 'signUp.html',
  controller: 'signUpController'
})

.when('/profile', {
  templateUrl: 'profile.html',
  //controller: 'mainController'
}); });

然后从我的控制器调用 /login post api

app.controller('authController', function($scope, $http, $rootScope, $location){   
  $scope.user = {username: '', password: ''};   
  $scope.error_message = '';

  $scope.login = function(){
    $http.post('/login', $scope.user).success(function(data){
      if(data.state == 'success'){
        //set username authenticated property to true after successful log in
        //I am only pasting some of my code here, more logic before controller
        $rootScope.authenticated = true;
        $rootScope.current_user = "james";
        $location.path('/profile');
      }
      else{
        $scope.error_message = data.message;
      }
    });   
  }; 
});

这是我的登录信息api

router.post('/login', passport.authenticate('local-login', {
        successRedirect : '/success', // redirect to the secure profile section
        failureRedirect : '/failure', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

当它成功时,它调用 success 发送回应该在 $http.post 中触发回调的数据,并通过 $location.path('/profile'); 重定向页面。但是,没有调用回调,我的页面显示来自 res.send

的用户信息
//sends successful login state back to angular
    router.get('/success', function(req, res){
        res.send({state: 'success', user: req.user ? req.user : null});
    });

我走在正确的轨道上吗?我只是按照微软的教程 https://www.microsoftvirtualacademy.com/en-us/training-courses/mean-stack-jump-start-8442 但是他们在 github 上完成的页面甚至不起作用所以它不能帮助我调试我的这个问题。

你似乎对前端和后端想要在这里做什么有轻微的阻抗不匹配。您的 AngularJS 代码期望向 API 端点发送 POST 并返回 200(成功)以及一些 JSON 数据,这些数据告诉它有关成功或失败的信息登录尝试。

后端认为它会收到 POST 然后将调用者重定向到新位置。至少我是这样读的。它不仅仅是用 HTTP 响应代码 200 或错误代码发回一些数据。

我想你想调整后端代码以简单地 return 数据到前端以获得你期望的结果。

在 passport 中使用 successRedirectfailureRedirect 会将客户端重定向到指定的页面,这将阻止您的客户端 angularJS 路由发生。您在登录后看到用户信息的原因是您的客户端被重定向到 /success 页面,而不是实际响应原始请求。客户端然后使用 GET 请求获取成功页面,然后使用用户信息响应新的 GET 请求。

我建议在使用 AngularJS 时保留 node.js 重定向,因为您可能希望在客户端处理重定向:

router.post('/login', passport.authenticate('local-login'), function(req, res){
    res.send(req.user);
});

如果用户未通过身份验证,内联函数将永远不会执行。相反,passport 将直接响应 401 错误状态,正文为 "Unauthorized"。因此不需要 success 状态。在客户端,你应该使用 .error() 函数来处理 401 错误,而不是检查你的状态变量:

$http.post('/login', $scope.user).success(function(user){
    $rootScope.authenticated = true;
    $rootScope.current_user = "james";
    $location.path('/profile');
  })
 .error(function(err){
    $scope.error_message = err;
  });

如果您想返回一个更具体的原因,说明请求未被授权的原因(这并不总是一个好主意),您可以使用即时消息,并从 angular 发出另一个 GET 请求到获取更详细的授权失败消息。

到目前为止,我还没有看到 Ajax 调用 API 重定向到页面的成功。我们有类似的情况,其中 API 调用可能会导致重定向到错误页面。我们想在服务器中处理它,而不是让 UI (Angular) 来处理。但是,看到 none 的重定向方法(如 res.redirect)正在工作,这真是令人沮丧。 我们的场景是 Angular 通过 Ajax 进行 API 调用,Node.js 上的 API 运行 应该重定向到 html 页面。