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

Node.js开发航空气象API无法每小时获取最新METAR/TAF数据问题

问题根因

你当前代码中的气象数据拉取逻辑仅在Node.js加载该路由模块时执行1次,后续所有接口请求返回的都是服务启动时拉取的静态旧数据,不会自动更新。

解决方案:后台定时拉取+缓存

我们把数据拉取逻辑封装为可复用函数,服务启动时先拉取一次初始数据,之后每小时触发一次拉取更新缓存,路由直接返回最新缓存即可,性能更高,不需要每次请求都调用远端接口。

修改后的完整代码如下:

var express = require('express');
var router = express.Router();
const ADDS = require('adds');
var moment = require('moment');

// adds moment to the locals
router.use((req, res, next)=>{
  res.locals.moment = moment;
  next();
});

// 缓存最新气象数据的变量
let cachedWeatherData = null;
// 数据拉取函数封装
async function fetchWeatherData() {
  try {
    const results = await Promise.all([
      ADDS('metars', {
        stationString: 'KCRX,KMSL,KSNH,KTUP',
        hoursBeforeNow: 1,
        mostRecentForEachStation: true
      }),
      ADDS('tafs', {
        stationString: 'KTUP,KMSL',
        hoursBeforeNow: 1,
        mostRecentForEachStation: true
      })
    ]);
    // 拉取成功更新缓存
    cachedWeatherData = results;
  } catch (err) {
    // 拉取失败打印错误,保留旧缓存不影响服务
    console.error('气象数据拉取失败:', err);
  }
}

// 启动时先拉取一次初始数据
fetchWeatherData();
// 每小时(3600*1000毫秒)拉取一次更新数据
setInterval(fetchWeatherData, 3600 * 1000);

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('wet_av', {
    parsedData: cachedWeatherData
  })
});

module.exports = router;

注意事项

  • 代码中加入了异常捕获,单次拉取失败不会清空原有缓存,保证服务可用性
  • 定时任务的触发间隔可根据你的实际需求调整,源数据每小时更新的话设置为3600*1000毫秒即可

内容的提问来源于stack exchange,提问作者W.Young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:06