www 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #!/usr/bin/env node
  2. /**
  3. * Module dependencies.
  4. */
  5. var app = require('../app');
  6. var debug = require('debug')('myself-project-nodejs:server');
  7. var http = require('http');
  8. require('dotenv').config();
  9. /**
  10. * Get port from environment and store in Express.
  11. */
  12. var port = normalizePort(process.env.PORT || '3000');
  13. app.set('port', port);
  14. /**
  15. * Create HTTP server.
  16. */
  17. var server = http.createServer(app);
  18. /**
  19. * Listen on provided port, on all network interfaces.
  20. */
  21. const { grb2DownloadManager } = require("../schema/downloadGrib2");
  22. const { getGrib2FileUrl } = require("../schema/getGrb2FileUrl");
  23. async function initDownloadManager() {
  24. global.downloadManager = { manager: new grb2DownloadManager(), getGrib2FileUrl, downloadTimmer: null, downloadTimmerInterval: 3600 };
  25. // console.log("气象文件下载器已初始化完成...随项目初次启动默认执行一次下载任务...");
  26. const downloader = global.downloadManager.manager;
  27. // 监听事件
  28. downloader.on(downloader.EVENTS.STATUS_CHANGE, (status) => {
  29. console.log('状态变更:', status);
  30. });
  31. downloader.on(downloader.EVENTS.TASK_ADDED, (task) => {
  32. console.log('任务已添加:', task.fileName);
  33. });
  34. downloader.on(downloader.EVENTS.TASK_START, (task) => {
  35. console.log('任务开始:', task.fileName);
  36. });
  37. // downloader.on(downloader.EVENTS.TASK_PROGRESS, (progress) => {
  38. // console.log(`下载进度: ${progress.task.fileName} - ${progress.percent.toFixed(2)}%`);
  39. // });
  40. downloader.on(downloader.EVENTS.TASK_COMPLETE, (task) => {
  41. console.log('任务完成:', task.fileName);
  42. });
  43. downloader.on(downloader.EVENTS.TASK_SKIP, (task, reason) => {
  44. console.log('任务跳过:', task.fileName, '-', reason);
  45. });
  46. downloader.on(downloader.EVENTS.TASK_ERROR, (task, error) => {
  47. console.log('任务错误:', task.fileName, '-', error.message);
  48. });
  49. downloader.on(downloader.EVENTS.QUEUE_EMPTY, () => {
  50. console.log('队列已空');
  51. });
  52. downloader.on(downloader.EVENTS.ALL_COMPLETE, (result) => {
  53. console.log('所有任务完成');
  54. console.log('成功:', result.completed.length);
  55. console.log('失败:', result.failed.length);
  56. });
  57. startDownload();
  58. console.log(`已启动自动化下载计时器,${formatTime(global.downloadManager.downloadTimmerInterval)}后将再次自动下载气象模型`);
  59. global.downloadManager.downloadTimmer = setInterval(() => {
  60. startDownload();
  61. }, global.downloadManager.downloadTimmerInterval * 1000)
  62. }
  63. // https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl?dir=/gfs.20250909/00/atmos&file=gfs.t00z.pgrb2.1p00.f003&all_var=on&all_lev=on&toplat=90&leftlon=0&rightlon=360&bottomlat=-90
  64. async function startDownload() {
  65. const urls = await global.downloadManager.getGrib2FileUrl();
  66. global.downloadManager.manager.addTasks(urls);
  67. global.downloadManager.manager.start();
  68. }
  69. function formatTime(seconds) {
  70. const hours = Math.floor(seconds / 3600);
  71. const minutes = Math.floor((seconds % 3600) / 60);
  72. const secs = seconds % 60;
  73. let str = ``;
  74. if (hours > 0) {
  75. str += `${hours}小时`;
  76. }
  77. if (minutes > 0) {
  78. str += `${hours > 0 ? (minutes < 0 ? "0" + minutes : minutes) : minutes}分`
  79. }
  80. if (minutes > 0 || secs > 0) {
  81. str += `${minutes > 0 ? (secs < 0 ? "0" + secs : secs) : secs}秒`
  82. }
  83. return str;
  84. }
  85. server.listen(port, () => {
  86. console.log("api server running at http://127.0.0.1:" + port)
  87. // initDownloadManager();
  88. });
  89. server.on('error', onError);
  90. server.on('listening', onListening);
  91. /**
  92. * Normalize a port into a number, string, or false.
  93. */
  94. function normalizePort(val) {
  95. var port = parseInt(val, 10);
  96. if (isNaN(port)) {
  97. // named pipe
  98. return val;
  99. }
  100. if (port >= 0) {
  101. // port number
  102. return port;
  103. }
  104. return false;
  105. }
  106. /**
  107. * Event listener for HTTP server "error" event.
  108. */
  109. function onError(error) {
  110. if (error.syscall !== 'listen') {
  111. throw error;
  112. }
  113. var bind = typeof port === 'string'
  114. ? 'Pipe ' + port
  115. : 'Port ' + port;
  116. // handle specific listen errors with friendly messages
  117. switch (error.code) {
  118. case 'EACCES':
  119. console.error(bind + ' requires elevated privileges');
  120. process.exit(1);
  121. break;
  122. case 'EADDRINUSE':
  123. console.error(bind + ' is already in use');
  124. process.exit(1);
  125. break;
  126. default:
  127. throw error;
  128. }
  129. }
  130. /**
  131. * Event listener for HTTP server "listening" event.
  132. */
  133. function onListening() {
  134. var addr = server.address();
  135. var bind = typeof addr === 'string'
  136. ? 'pipe ' + addr
  137. : 'port ' + addr.port;
  138. debug('Listening on ' + bind);
  139. }