You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Amadeus航班预订正常但酒店预订API报错求助

问题解决方法

一、Amadeus Node.js库调用的Invalid access token问题

你每次调用hotelSearch都新建Amadeus实例,这会破坏库内部的token缓存机制,甚至导致重复请求token时出现冲突。航班预订能成功是因为之前的实例缓存了有效token,但酒店调用时新建实例的token获取流程出了问题。

修复方案:

  1. 全局单例实例:在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;
    }
  }
}
  1. 更新依赖版本:执行npm update amadeus升级到最新稳定版,旧版本可能存在token处理的bug。
  2. 验证环境变量:在实例初始化时打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:50:29