Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么不是';重定向真的重定向了我?_Javascript_Angularjs_Node.js_Express_Passport.js - Fatal编程技术网

Javascript 为什么不是';重定向真的重定向了我?

Javascript 为什么不是';重定向真的重定向了我?,javascript,angularjs,node.js,express,passport.js,Javascript,Angularjs,Node.js,Express,Passport.js,我有一个基本的登录控制器,带有一个更新用户$scope的表单。单击按钮时,将触发login()函数 .controller('loginCtrl', ['$scope','$http',function($scope,$http) { $scope.user = { 'username' : "", 'password' : "" }; $scope.login = function(){ $http.post('/lo

我有一个基本的登录控制器,带有一个更新用户$scope的表单。单击按钮时,将触发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);

});
这是我的护照
本地登录名

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);
            }
        }
    });
}));
这里的主要问题是,当在我的路由逻辑中触发
res.redirect('/view1')
时,控制器接收html页面作为
响应.data
,而不是实际被重定向。(
$http.post().then(函数(响应){});


如果这是不正确的,那么在用户成功登录后,我应该如何处理重定向到
/view1

当您从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;
}

因此,您是说,而不是执行
return res.redirect('/view1')我应该执行
返回res.status(301)
然后将您的代码添加到我的
中。然后(函数(响应){})
代码?编辑:看到您的编辑,现在就开始尝试。res.redirect()默认发送302代码(在post中修复)(),因此,如果您使用此方法,您不需要更改后端的任何内容。我继续使用第二种发送JSON的方法,因为无论哪种方法,客户端都需要处理请求。1我所做的更改是更新
$window.location.href=response.data.redirectTo
使用角度$location提供程序<代码>$location.path(response.data.redirectTo)