【问题标题】:Why isn't res.redirect actually redirecting me?为什么 res.redirect 实际上没有重定向我?
【发布时间】:2017-07-30 22:28:57
【问题描述】:

我有一个基本的登录控制器,它带有一个更新用户 $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);
        });

    }

}]);

这是我的 /login 路由

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);
            }
        }
    });
}));

这里的主要问题是当res.redirect('/view1') 在我的路由逻辑中被触发时,控制器接收到的html 页面是response.data,而不是实际被重定向。 ($http.post().then(function (response){});)

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

【问题讨论】:

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


    【解决方案1】:

    当您从 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.status(301) 而不是return res.redirect('/view1'); 然后将你的代码添加到我的.then(function (response){}) 代码中?编辑:看到你的编辑,现在试试这个。
    • res.redirect() 默认发送一个 302 代码(在帖子中修复)(expressjs.com/de/4x/api.html#res.redirect),因此如果您采用这种方法,您不需要在后端更改任何内容
    • 我继续使用您发送 JSON 的第二种方法,因为无论哪种方式客户端都需要处理请求。我所做的 1 项更改是更新 $window.location.href = response.data.redirectTo; 以使用角度 $location 提供程序。 $location.path(response.data.redirectTo)
    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多