NuxtJS/VueJS环境下TradingView调用getBars的onHistoryCallback报错问题
问题排查结果
核心错误原因
你的代码存在3个逻辑问题,直接导致报错:
this.$axios.$get后直接换行写参数括号,触发JS自动分号插入机制,请求逻辑没有正确执行onErrorCallback放在了axios异步请求的外部,会在发起请求时同步立即执行,而非请求失败时才触发,直接打乱TradingView的回调时序- 没有给axios请求添加
.catch()捕获异常分支,请求报错时无法正确触发错误回调
修正后代码
getBars: (symbolInfo, resolution, periodParams, onHistoryCallback, onErrorCallback, firstDataRequest) => { this.$axios.$get( this.datafeedUrl + '/history?symbol=' + symbolInfo.name + '&resolution=' + resolution + '&from=' + periodParams.from + '&to=' + periodParams.to + '&countback=20' ) .then((r) => { let bars = []; // 补充返回数据非空校验,避免接口返回空结构时报错 if (!r || !r.t || !Array.isArray(r.t) || r.t.length === 0) { onHistoryCallback([], {noData: true}) return } for (let i = 0; i < r.t.length; ++i) { let bar = { time: 1e3 * r.t[i], close: parseFloat(r.c[i]), open: parseFloat(r.o[i]), high: parseFloat(r.h[i]), low: parseFloat(r.l[i]), volume: parseFloat(r.v[i]) } bars.push(bar) } // 补充K线按时间升序校验,TradingView要求K线必须按时间从小到大排列 bars.sort((a, b) => a.time - b.time) onHistoryCallback(bars, {noData: false}) }) .catch((e) => { // 错误回调放在catch分支,仅请求失败时触发 onErrorCallback(e) console.log(e) }) },
附加校验建议
- 确认接口返回的
r.t字段是Unix秒级时间戳,避免接口已经返回毫秒级时间戳导致乘1000后时间超出合理范围 - 确认返回的K线没有重复时间戳,TradingView不允许同周期出现重复时间的K线
内容的提问来源于stack exchange,提问作者Mehdi Rafiee
相关产品推荐
相关产品推荐

