如何判断API返回数据是否比已拉取的历史数据更新?
解决TagoIO定时拉取API时的数据更新判断问题
核心方案
统一将API返回的时间戳转换为毫秒级时间戳(JavaScript标准时间格式),同时在TagoIO中持久化记录上次成功存储数据的最新时间戳,每次拉取后通过对比这两个数值判断是否为新数据,彻底规避不同时间戳格式的兼容问题。
具体实现步骤
1. 依赖准备
在TagoIO的Analysis模块中,确保已添加axios和@tago-io/sdk依赖(可在Analysis的依赖管理面板直接安装)。
2. 代码实现
const axios = require('axios'); const { Device } = require('@tago-io/sdk'); // 替换为你的TagoIO设备令牌(用于存储状态和数据) const DEVICE_TOKEN = 'YOUR_DEVICE_TOKEN_HERE'; // 替换为目标API的请求地址 const API_URL = 'YOUR_TARGET_API_URL'; async function fetchAndStoreData() { const device = new Device({ token: DEVICE_TOKEN }); // 1. 获取上次存储的最新时间戳(初始值设为0表示第一次拉取) const [lastTimestampRecord] = await device.getData({ variable: 'last_fetched_timestamp', qty: 1, }); const lastStoredTimestamp = lastTimestampRecord ? Number(lastTimestampRecord.value) : 0; try { // 2. 拉取API数据 const apiResponse = await axios.get(API_URL); const apiData = apiResponse.data; // 3. 统一转换API返回的时间戳为毫秒级 // 假设API返回的时间字段是`data_timestamp`,根据实际字段名修改 let currentDataTimestamp; const rawTimestamp = apiData.data_timestamp; // 处理常见时间格式:ISO字符串、秒级时间戳、毫秒级时间戳 if (typeof rawTimestamp === 'string') { currentDataTimestamp = new Date(rawTimestamp).getTime(); } else if (typeof rawTimestamp === 'number') { // 区分秒级(10位)和毫秒级(13位)时间戳 currentDataTimestamp = rawTimestamp.toString().length === 10 ? rawTimestamp * 1000 : rawTimestamp; } else { throw new Error('无法识别的时间戳格式'); } // 4. 判断当前数据是否比上次存储的更新 if (currentDataTimestamp > lastStoredTimestamp) { // 5. 存储新数据到TagoIO(根据API数据结构调整变量名和值) await device.sendData({ variable: 'sensor_data', value: apiData.sensor_value, time: new Date(currentDataTimestamp), // 用转换后的时间戳设置数据时间 }); // 6. 更新上次存储的时间戳 await device.sendData({ variable: 'last_fetched_timestamp', value: currentDataTimestamp, time: new Date(), }); console.log('新数据已成功存储'); } else { console.log('当前API返回的是旧数据,无需存储'); } } catch (error) { console.error('拉取或存储数据失败:', error.message); } } // 执行主函数 fetchAndStoreData();
3. 关键细节说明
- 时间戳兼容处理:覆盖了ISO字符串、秒级/毫秒级数字时间戳等常见格式,可根据API实际返回调整转换逻辑
- 状态持久化:通过TagoIO的
last_fetched_timestamp变量记录最新时间,避免Analysis重启后丢失状态 - 自动化任务适配:保持每30分钟执行的配置,API返回旧数据时自动跳过存储,不会产生冗余数据
边界情况处理
- 首次执行时
lastStoredTimestamp为0,直接存储首次拉取的数据 - API无新数据返回(时间戳≤上次存储时间)时,自动跳过存储
- 时间戳转换失败时捕获错误并打印日志,避免Analysis崩溃
内容的提问来源于stack exchange,提问作者macb2001
相关产品推荐
相关产品推荐

