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
相关产品推荐
相关产品推荐

