【问题标题】:Angularjs Express.Js redirect Issue with angular Ajax callAngularjs Express.Js 重定向问题与 Angular Ajax 调用
【发布时间】:2014-04-04 09:55:36
【问题描述】:

我有一个从 angular js 到 Express.js api 的 $http pst ajax 调用。在 Express.js 部分中,我使用节点的异步模块来串行执行代码。当没有问题时,我想重定向到特定页面。因为如果我使用 res.render('url') 我正在从 angular 进行 ajax 调用,所以这不会重定向页面,而是在 angularjs 上提醒我。顺便说一句,我在角度上也有一个 $routeProvider :)。即重定向后加载部分模板

angular AJAX POST CALL 代码

app.controller('MainCtrl',function($scope,$http){
    $scope.loginForm=function(){
        alert($scope.username);
        $http.post('/login',{'name': $scope.username}).
        success(function(data) {
            alert(data);
        }).
        error(function(data) {
             alert(data);
        });
    }
});

Node.js(Express.js) api 验证和重定向

app.post('/login',function(req,res){

var name= req.body.name;
//var password= req.body.password;
async.series([
    function (callback){
        var query= client.query('select count(*) as lgResult from Login where Email='+'"'+req.body.name+'"',function(err,result,field){
            if(err) return callback(err);
            if(result[0]['lgResult'] === 0){
                res.send('passwordWrong');
            }
            if(result[0]['lgResult'] === 1){
                callback(null, 'one');
            }

        });

    },
    function (callback){
        var query= client.query('select count(*) as lgResult from Login where Email='+'"'+req.body.name+'"',function(err,result,field){
            if(err) return callback(err);
            if(result[0]['lgResult'] === 0){
                res.send('passwordWrongSecondtime');
            }
            if(result[0]['lgResult'] === 1){
                 callback(null, 'two');
            }
        });
    }],
    function (err,results){
        if(err) {
            console.log(err);
            res.send('Something Broke sorry');
        }
        else{
            res.render('employelogin/employlogin');
        }
    });

});

角度路由:)

app.config(function($routeProvider, $controllerProvider,$compileProvider){
 app.registerCtrl = $controllerProvider.register;
  app.compileProvider    = $compileProvider.directive;
        $routeProvider
        .when('/employeeTimeSheet',{
            controller:'MainCtrl',
            templateUrl:'employeeTimeSheet.html'
        })
        .when('/employeeLogin',{
            templateUrl:'employeeDashboard.html'
        })
        .otherwise({redirectTo:'/employeeLogin'});

});

我的错误是什么

【问题讨论】:

  • 您有任何错误吗?它们是什么?
  • 我没有收到错误,而不是重定向,我在我的角度 js 端成功收到警报。
  • @EliranMalka Atlast 找到了一种可行的方法,不确定它是否是最好的方法 res.contentType('application/html'); var data = 'emplogin/empr/:'+结果; res.header('Content-Length', data.length); res.end(数据);在 Angularjs 端,我们可以使用 $windows.location=data;

标签: javascript node.js angularjs express angularjs-routing


【解决方案1】:

只是不要尝试在一个 HTTP 请求中处理所有内容。

  1. 在 Express 应用程序中使用 res.send(200, 'ok'); (或类似的东西)而不是 res.render();这使得 Angular 运行 .success() 回调。
  2. res.send('Something broken') 将触发 Angular 的成功回调,因为它默认发送 200 个 HTTP 代码,因此在响应中添加错误状态代码。例如res.send(500, '东西坏了');在这种情况下,Angular 将运行 .error 回调。
  3. 在 Angular 成功回调中重定向到所需页面并让 Angular 决定从服务器请求哪个视图。 (提示:$location 服务在这里很有帮助http://docs.angularjs.org/guide/dev_guide.services.$location)

在你的成功回调中使用

$location.path('/employeeTimeSheet');

这将处理重定向。并且不要忘记向控制器注入 $location 服务。

【讨论】:

  • 您的想法有效!但是我还想要一些别的东西...我希望将整个页面重定向到不同的页面,并且 express 有一些结果进来我将不得不在页面上打印它们。假设我必须重定向到一个新的员工仪表板页面。我必须展示一个新的模板设计:)
  • 可能是 res.redirect('/path/to/new/page');会做这项工作吗?这会将您的整个应用重定向到新位置:app.com 之后将变为 app.com/path/to/new/page
  • 使用 res.redirect 这就是我在控制台 302 上得到的结果 临时移动了 31 毫秒
  • 是的,这就是 express 发送的响应。现在您的浏览器应该遵循重定向并更改路径。
  • 我收到关于 angularjs 的响应...关于 angularjs 方面的成功警报和重定向没有发生 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多