如何用Node.js编写Heroku高级调度任务?附Ruby示例
Node.js实现Heroku Dyno保活任务
对应你提供的Ruby保活任务,下面是Node.js的实现方案:
Ruby原示例参考
desc "Pings PING_URL to keep a dyno alive" task :dyno_ping do require "net/http" if ENV['PING_URL'] uri = URI(ENV['PING_URL']) Net::HTTP.get_response(uri) end end
方法一:使用Node.js原生http模块
无需额外安装依赖,直接用内置模块编写脚本(示例命名为dyno-ping.js):
const http = require('http'); const https = require('https'); const pingUrl = process.env.PING_URL; if (!pingUrl) { console.log('PING_URL环境变量未设置,跳过保活请求'); process.exit(0); } // 根据URL协议选择对应模块 const client = pingUrl.startsWith('https') ? https : http; client.get(pingUrl, (res) => { console.log(`保活请求发送成功,状态码:${res.statusCode}`); res.resume(); // 消耗响应流,避免内存泄漏 process.exit(0); }).on('error', (err) => { console.error('保活请求失败:', err.message); process.exit(1); });
方法二:使用node-fetch(语法更简洁)
如果偏好现代异步语法,可使用node-fetch库:
- 先安装依赖:
npm install node-fetch --save
- 编写脚本(示例命名为
dyno-ping-fetch.js):
const fetch = require('node-fetch'); const pingUrl = process.env.PING_URL; async function pingDyno() { if (!pingUrl) { console.log('PING_URL环境变量未设置,跳过保活请求'); return; } try { const response = await fetch(pingUrl); console.log(`保活请求发送成功,状态码:${response.status}`); } catch (err) { console.error('保活请求失败:', err.message); } } pingDyno();
Heroku高级调度配置
- 进入Heroku控制台的「高级调度(Advanced Scheduler)」,添加新任务
- 任务命令填写:
node dyno-ping.js(根据你的脚本实际路径调整) - 设置调度频率(建议每10分钟一次,避免dyno休眠)
- 在Heroku「设置」→「配置变量」中添加
PING_URL,值为你的应用访问地址(比如Heroku分配的域名)
内容的提问来源于stack exchange,提问作者learncode
相关产品推荐
相关产品推荐

