我有用AngularJS编写的应用程序。我想访问FlightAware API。我使用以下代码:
let Client = require('node-rest-client').Client;
let username = 'x';
let apiKey = 'y';
let fxmlUrl = 'https://flightxml.flightaware.com/json/FlightXML3/'
let client_options = {
user: username,
password: apiKey
}
let client = new Client(client_options);
client.registerMethod('findFlights', fxmlUrl + 'FindFlight', 'GET');
client.registerMethod('weatherConditions', fxmlUrl + 'WeatherConditions', 'GET');
let findFlightArgs = {
parameters: {
origin: 'KIAH',
destination: 'KJFK',
type: 'nonstop'
}
}
let weatherConditionsArgs = {
parameters: {
airport_code: 'KHOU'
}
}
client.methods.weatherConditions(weatherConditionsArgs, function (data, response) {
console.log('Current conditions at Hobby Airport: %j', data.WeatherConditionsResult.conditions[0]);
})
当我在nodeJS中执行它时它可以工作但是在我的AngularJS应用程序中我得到一个错误:
Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response.
我发现一些信息表明这个错误与CORS有关但服务器端是相同的,无论我使用AngularJS还是NodeJS来运行代码。如何在AngularJS中没有错误的情况下执行它?
答案 0 :(得分:0)
错误消息说,FlightXML服务器(https://flightxml.flightaware.com)没有设置相应的CORS标头,这是从浏览器运行所必需的。 (CORS是" on",如果从http://yoursite.com运行的浏览器应用程序从其他主机获取数据,例如https://flightxml.flightaware.com)
CORS限制仅适用于在 浏览器中运行的应用程序。所以"相同"在NodeJS(服务器端)上运行的JavaScript代码不会受到此类限制。
不幸的是,外部服务器必须设置Access-Control-Allow-Headers: Authorization
标头,否则基于浏览器的方案将无法正常工作。所以看起来FlightXML不支持你的场景。
作为修复,我建议你创建一个服务器端代理,所以
http://yoursite.com/weather?args...
。