Chainlink外部适配器调用Spotify API报错问题排查
问题原因与修复方案
核心错误原因
- 对大小写敏感的Spotify艺人ID执行了强制大写转换:Spotify返回的艺人ID为大小写严格敏感的字符串,代码中
const artistID = validator.validated.data.artist.toUpperCase()会把合法ID里的小写字符转为大写,导致请求路径参数错误,触发Spotify返回404状态码。调用jsonplaceholder接口时ID为纯数字,大写转换不影响结果,因此可以正常返回。 - 硬编码的Access Token会过期:Spotify Client Credentials授权流下发的访问令牌有效期仅为1小时,硬编码写死的令牌会快速失效,触发Spotify返回401未授权错误。
修复步骤
- 删除艺人ID的强制大写逻辑,保留原始ID的大小写格式,可增加trim操作去除首尾空格:
// 原代码 // const artistID = validator.validated.data.artist.toUpperCase() // 修改后代码 const artistID = validator.validated.data.artist.trim()
- 替换硬编码令牌逻辑,新增动态获取有效访问令牌的逻辑:
首先确认已经将Spotify的客户端ID、客户端密钥配置到环境变量API_ID和API_KEY中,然后在发起艺人信息请求前调用令牌接口获取最新令牌:
const axios = require('axios') const createRequest = async (input, callback) => { const apiID = process.env.API_ID const apiKey = process.env.API_KEY const validator = new Validator(callback, input, customParams) const jobRunID = validator.validated.id const artistID = validator.validated.data.artist.trim() const url = `https://api.spotify.com/v1/artists/${artistID}` // 动态获取有效access token const tokenRes = await axios.post( 'https://accounts.spotify.com/api/token', 'grant_type=client_credentials', { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${Buffer.from(`${apiID}:${apiKey}`).toString('base64')}` } } ) const token = tokenRes.data.access_token const config = { url, headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } } // 后续原有Axios请求逻辑 }
- 补充请求错误捕获逻辑,打印Spotify返回的完整错误信息,方便后续排查:
axios(config) .then(res => callback(200, { jobRunID, data: res.data, statusCode: 200 })) .catch(e => callback(500, { jobRunID, error: e.response ? e.response.data : e.message, statusCode: e.response ? e.response.status : 500 }))
内容的提问来源于stack exchange,提问作者Dat Nguyen
相关产品推荐
相关产品推荐

