在WEB应用程序中重定向到不同URL的正确方法是什么?

时间:2015-03-14 13:00:00

标签: node.js redirect express

我有一个非常小的实验室"我正在为学习而写的应用程序。 这包括登录页面,以及成功登录后的单页应用程序。具有Express.js和客户端的Node.js中的后端是Angular.js

我在最初请求页面时使用res.sendFile成功提供登录页面,但是当我检测到成功登录时,我发送主APP页面,但没有任何反应。

这是代码

成功登录后,重定向到应用页面

var loginRequest = function( req, res, next ) {

var user = req.body.user;
var password = req.body.pass;

if ( user === '' || password === '' ) {

    //Some field is blank - insufficient information
    console.log('User login failure: Insufficient data');
    res.json(400, {});

} else {
    models.account.loginRequest ( user, password, function ( result )    {
    console.log ( result );
    if ( result != null ) {
        console.log('Login Succesful');
        userSession = req.session;
        userSession.user = user;
        res.redirect( 301,  '../app' );

    } else {
        console.log('Login NOT Succesful');
        res.status(401).json({});
    }
    });
}

}

在上面的代码中,目的是当我成功登录时,我会重定向到已创建会话的应用页面。

res.redirect( 301, '../app' );

然后,请求此/ app路径,下面的代码服务器

var serveApp = function( req, res, next ) {

console.log('--- sending app.html --- *hopefully');
var options = {
    root: publicPath,
    dotfiles: 'deny',
    headers: {
    'x-timestamp': Date.now(),
    'x-sent': true
    }
};

res.sendFile( 'app.html', options);

};

你注意到有一个服务器console.log()只是为了试图了解发生了什么。我在节点控制台上看到的是:

POST /users/loginRequest 301 9.266 ms - 40
--- sending app.html --- *hopefully
GET /app 200 41.145 ms - 140

在Chrome上的开发者工具上,我可以看到该文件已投放,但在Chrome本身上,它永远不会从请求用户和密码凭据的页面移动。

你能帮助我理解为什么这不起作用,或者如果我做错了,那么做正确的方法是什么?

由于

1 个答案:

答案 0 :(得分:0)

我对某人有用的情况,最后我做的是回答来自节点的响应200并处理Angular上的重定向

angular.module('loginToApp', [])
.constant ( 'loginURL', '/users/loginRequest')
.controller ( 'loginCtrl', function( $scope, $http, $window, loginURL ) {

    $scope.data = [
    { inEmail: '', inPass: '', loginError: false }
    ];

    $scope.loginRequest = function( user, pass ) {

    console.log('--- LoginRequest ---');
    console.log('User: ' + user);
    console.log('Pass: ' + pass);
    console.log('LoginRequest: ' + loginURL );

    $http.post ( loginURL,
             {
             user: user,
             pass: pass
             },
             { withCredentials: true })

        .success ( function( data, status, headers, config ) {
        console.log('--- SUCCESS ---');
        console.log('Data');
        console.log(data);
        console.log('Status');
        console.log(status);
        console.log('Headers');
        console.log(headers);
        console.log('Config');
        console.log(config);

        var appWindow = 'http://' + $window.location.host + data.appPath;
        console.log('--- APP window ---');
        console.log(appWindow);
        console.log('--- APP window ends ---');
        $window.location.href = appWindow;

        })
        .error ( function( data, status, headers, config ) {
        console.log('--- ERROR ---');
        console.log('Data');
        console.log(data);
        console.log('Status');
        console.log(status);
        console.log('Headers');
        console.log(headers);
        console.log('Config');
        console.log(config);

        if ( status != 301 ) {
            loginError ( true );
        }
    });
    };

    var loginError = function( bool ) {
    $scope.data.loginError = bool;
    }

});

当然,console.log只是一种初学者的方式(比如我自己),了解正在发生的事情,但并非必要。