Node Express不是重定向,而是返回一个字符串

时间:2015-05-03 19:41:09

标签: angularjs node.js express

我是node和angular的新手,试图找出如何重定向错误的请求。 Node本质上是RESTful API的代理。目前,weather.error正在填充为Bad Request. Redirecting to /public/400.html

服务器电话:

app.get('/currently', function(request, response) {
    var options = {
        exclude: 'minutely,hourly,daily,flags,alerts'
    };
    forecast.get(request.query.latitude, request.query.longitude, options, function(err, res, data) {
        if (err) {
            console.log('Error in request. \nLatitude: ' + request.query.latitude + '\nLongitude: ' + request.query.longitude);
            var status = data.split('<title>')[1].split(' ')[0]
            if (status === '404') {
                response.status(400).sendFile(__dirname + '/public/images/404/404-' + Math.floor((Math.random() * 3) + 1) + '.jpg');
            } else if (status === '400') {
                response.redirect(400, '/public/400.html');
            } else {
                response.status(parseInt(status)).end();
            }
        } else {
            response.send(JSON.stringify(data));
        }
    });
});

控制器:

angular.module('myApp.weather', [
    'ui.router'
])
  .config(function($stateProvider) {
      $stateProvider
          .state('weather', {
              url: '/weather',
              templateUrl: 'app/weather/weather.tmpl.html',
              controller: 'WeatherController as weather'
          });
  }).controller('WeatherController', function($http, $location) {
      var weather = this;
      weather.latitude = '';
      weather.longitude = '';

      weather.getCurrentWeatherByLatLon = function(latitude, longitude) {
          $http.get('/currently?latitude=' + latitude + '&longitude=' + longitude)
              .success(function(data, status, headers, config) {
                  weather.data = data;
              })
              .error(function(data, status, headers, config) {//I don't think this should be necessary if I'm handling it in the sever
                  weather.error = data;
                  if(data.indexOf('Bad Request') >= 0) { 
                      console.log('Bad Request')
                      $location.path('/public/400.html'); //doesn't navigate anywhere
                  }
              })
              ;
      };

------------------------------- EDIT --------------- ----------

我已将服务器调用更改为:

app.get('/currently', function(request, response) {
    var options = {
        exclude: 'minutely,hourly,daily,flags,alerts'
    };
    forecast.get(request.query.latitude, request.query.longitude, options, function(err, res, data) {
        if (err) {
            console.log('Error in request. \nLatitude: ' + request.query.latitude + '\nLongitude: ' + request.query.longitude);
            var status = data.split('<title>')[1].split(' ')[0]
            response.status(status).send();
        } else {
            response.send(JSON.stringify(data));
        }
    });
});

和我的控制器中的函数:

weather.getCurrentWeatherByLatLon = function(latitude, longitude) {
    $http.get('/currently?latitude=' + latitude + '&longitude=' + longitude)
        .success(function(data, status, headers, config) {
            weather.data = data; // this callback will be called asynchronously
                // when the response is available
        })
        .error(function(data, status, headers, config) {
            weather.error = status
            if (status == 400) {
                console.log('in 400');
                $location.url('/public/400.html');
            } else if (status == 404) {                              
                console.log('in 404');
                $location.url('/public/404.html');
            }
        });
};

2 个答案:

答案 0 :(得分:3)

您无法重定向ajax调用。使用response.redirect(400, '/public/400.html')进行的重定向只是一个带有&#34;特殊&#34;的HTTP响应。标题,ajax不支持。

如果您不想处理请求问题,请返回状态或同样处理并在客户端处理。

答案 1 :(得分:0)

我建议您使用url服务的locationProvider方法,此许可将流控制权传递给控制器​​管理路由:是您必须使用控制器

尝试

$location.url('/public/400.html');

而不是

$location.path('/public/400.html');

提供静态内容的另一个选择是将window服务用作:

尝试

$window.location.href ='/public/400.html';

而不是

$location.path('/public/400.html');

使用它代替标准的javascript窗口对象(from the docs):

  

对浏览器窗口对象的引用。窗口是全球性的   在JavaScript中可用,它会导致可测性问题,因为它是   全局变量。在角度我们总是通过它来引用它   $ window服务,因此可能会被覆盖,删除或嘲笑   测试

希望这个帮助