我是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');
}
});
};
答案 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服务,因此可能会被覆盖,删除或嘲笑 测试
希望这个帮助