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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:44:57