Amadeus航班预订正常但酒店预订API报错求助
问题解决方法
一、Amadeus Node.js库调用的Invalid access token问题
你每次调用hotelSearch都新建Amadeus实例,这会破坏库内部的token缓存机制,甚至导致重复请求token时出现冲突。航班预订能成功是因为之前的实例缓存了有效token,但酒店调用时新建实例的token获取流程出了问题。
修复方案:
- 全局单例实例:在NestJS服务的构造函数中初始化一次Amadeus实例,后续所有请求复用该实例:
@Injectable() export class AmadeusService { private amadeus: Amadeus; constructor() { this.amadeus = new Amadeus({ clientId: process.env.API_KEY, clientSecret: process.env.API_SECRET }); } async hotelSearch(data) { try { return await this.amadeus.shopping.hotelOffers.get(data); } catch (error) { return error; } } }
- 更新依赖版本:执行
npm update amadeus升级到最新稳定版,旧版本可能存在token处理的bug。 - 验证环境变量:在实例初始化时打印
process.env.API_KEY和process.env.API_SECRET,确认酒店调用时环境变量已正确加载(避免不同环境配置不一致的问题)。
二、Axios手动调用的400错误问题
从响应的config可以看到,你用GET请求调用/v1/reference-data/locations/hotels/by-city时,把参数放在了data字段里,但GET请求不支持通过请求体传递参数,Amadeus的该API要求参数通过URL查询字符串传递。
修复方案:
将请求参数从data字段移到params字段,Axios会自动拼接成URL的query参数:
async hotelSearch(data) { try { const tokenData = await this.getToken(); const authToken = 'Bearer ' + tokenData.access_token; const config: AxiosRequestConfig = { method: 'get', url: 'https://test.api.amadeus.com/v1/reference-data/locations/hotels/by-city', params: data, // 替换原data字段为params headers: {'Authorization': authToken}, }; return await axios(config).then((response) => { return JSON.stringify(response.data); }).catch((error) => { return error; }); } catch (error) { return error; } }
同时优化getToken的错误处理,避免token获取失败时后续流程报错:
async getToken(): Promise<{access_token: string}> { try { const data = qs.stringify({ client_id: process.env.API_KEY, client_secret: process.env.API_SECRET, grant_type: 'client_credentials' }); const config: AxiosRequestConfig = { method: 'post', url: 'https://test.api.amadeus.com/v1/security/oauth2/token', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: data }; const response = await axios(config); return response.data; } catch (error) { console.error('获取token失败:', error); throw error; // 抛出错误让上层处理,避免后续拼接无效token } }
内容的提问来源于stack exchange,提问作者jatin
相关产品推荐
相关产品推荐

