为什么没有res.redirect实际重定向我?

时间:2017-03-09 19:23:33

标签: javascript angularjs node.js express passport.js

我有一个基本的登录控制器,其表单可以更新用户的$ scope。当他们点击按钮时,会触发login()函数。

<br>

这是我的/ login

的路由
.controller('loginCtrl', ['$scope','$http',function($scope,$http) {

    $scope.user = {
        'username' : "",
        'password' : ""
    };

    $scope.login = function(){
        $http.post('/login', $scope.user).then(function (response){
            console.log(response.data);
        });

    }

}]);

这是我的护照app.post('/login', function(req,res,next){ passport.authenticate('local-login', function(err, user, info){ if (err){ console.log(err); return next(err); } else if (!user){ return res.send(info); } else { req.logIn(user, function(err){ if (err){ return next(err); } else { return res.redirect('/view1'); } }); } })(req,res,next); });

local-login

这里的主要问题是当我的路由逻辑中触发passport.use('local-login', new LocalStrategy({ passReqToCallback: true // Allows us to pass back the entire request to the callback function }, function (req, email, password, done){ // Checks database via mongoose ,function (err,user){ if (err){ return done(err); } else { if (!user){ return done(null, false, { message : 'No user found.'}); } else if (!user.validPassword(password)) { return done(null, false, { message : 'Incorrect password'}); } else { return done(null, user); } } }); })); 时,控制器正在接收html页面res.redirect('/view1')而不是实际被重定向。 (response.data

如果这不正确,我应该在用户成功登录后如何实际处理重定向到$http.post().then(function (response){});

1 个答案:

答案 0 :(得分:2)

当你从javascript调用后端时,你基本上在场景后面进行ajax调用,这对于重定向和其他HTTP头不起作用。

为了将用户重定向到正确的页面,您必须检查后端响应中的HTTP状态代码,并通过angular将用户重定向到正确的站点。这看起来像这样:

if(response.status == 302) {
    $window.location.href = '/view1';
}

或者不是发送重定向,您可以从服务器发送状态更新,如:

res.json({
    success: true,
    redirectTo: '/view1'
});

并在客户端上解析它:

if(response.data.success){
   $window.location.href = response.data.redirectTo;
}