使用browserify打包node-cron实现JS定时任务时遇process.hrtime错误
浏览器端使用node-cron定时任务报错解决办法
问题背景
要实现网站每天凌晨12点执行定时任务,因浏览器环境无法直接使用require(),尝试用browserify打包node-cron相关代码,编写了data_retrieve.js:
class RunCron { constructor() { var cron = require('node-cron'); cron.schedule('0 0 * * *', () => { $.ajax({ type: "POST", url: "/main.py", data: { param: text} }).done(function( o ) { console.log("Done running py!"); }); }); } } var r = new RunCron();
打包生成bundle.js后,运行时出现错误:
Uncaught TypeError: process.hrtime is not a function at Scheduler.start (bundle.js:1791:33) at new ScheduledTask (bundle.js:1749:29) at createTask (bundle.js:1564:12) at Object.schedule (bundle.js:1553:18) at new RunCron (bundle.js:1229:8) at 5.node-cron (bundle.js:1246:9) at o (bundle.js:1:633) at r (bundle.js:1:799) at bundle.js:1:828 at bundle.js:1:318
追踪错误到bundle.js中Scheduler类的start方法,该方法依赖Node.js的process.hrtime()API。
错误原因
node-cron是专为Node.js环境设计的定时任务库,底层依赖Node.js内置的process对象及相关API(如process.hrtime),而浏览器环境中不存在process对象,browserify无法完整模拟这类Node.js专属API,因此打包后运行报错。
另外,浏览器端定时任务本身存在可靠性问题:用户关闭页面、浏览器进入休眠状态都会导致任务中断,无法保证每天凌晨稳定执行。
解决办法
方案1:改用浏览器兼容的定时任务库
选择支持浏览器环境的cron库,比如croner(同时支持Node.js和浏览器):
- 安装依赖:
npm install croner
- 修改
data_retrieve.js代码:
import Cron from 'croner'; class RunCron { constructor() { // 每天凌晨12点执行任务 Cron('0 0 * * *', () => { $.ajax({ type: "POST", url: "/main.py", data: { param: text } }).done(() => { console.log("Done running py!"); }); }); } } var r = new RunCron();
- 用browserify打包该文件即可,
croner不依赖Node.js专属API,可在浏览器中正常运行。
方案2:将定时任务迁移到服务器端(推荐)
服务器端的定时任务不受浏览器状态影响,稳定性更高,步骤如下:
- 在服务器上搭建Node.js服务,安装依赖:
npm install node-cron axios
- 编写服务器端定时任务代码(比如
server-cron.js):
const cron = require('node-cron'); const axios = require('axios'); // 每天凌晨12点调用接口 cron.schedule('0 0 * * *', async () => { try { await axios.post('http://你的域名/main.py', { param: text }); console.log("Done running py!"); } catch (err) { console.error("任务执行失败:", err); } });
- 启动该服务(可配合pm2等工具保证服务持续运行),即可实现每天自动执行任务。
内容的提问来源于stack exchange,提问作者Gu5t4v
相关产品推荐
相关产品推荐

