nodejs使用定时器

本文介绍如何使用Node-Schedule模块在Node.js环境中设置精确到秒的定时任务。通过示例代码展示如何每分钟的第15秒执行一次任务,并解释了cron表达式的各个部分所代表的意义。

一、模块安装

yarn add node-schedule

二、使用(ts版)

import * as schedule from 'node-schedule';

schedule.scheduleJob('15 * * * * *', () => {
    // 每分钟的第15秒执行
    console.log('time: ' + new Date());
});

三、参数说明

'15 * * * * *'
分别对应:秒 分 时 日 月 周

详细参考:https://github.com/node-schedule/node-schedule

<think> 我们被要求提供Node.js中global对象的使用例子。根据引用资料,我们知道在Node.js中,global对象类似于浏览器中的window对象,是全局对象。以下是一些global对象的使用例子: 1. 使用全局定时器方法(setTimeout, setInterval等): 这些方法实际上是global对象的方法,但在全局作用域中可以直接使用。 2. 访问全局变量:在Node.js中,如果在一个模块中定义了一个变量而没有使用var、let或const,它会成为global对象的属性(但在Node.js模块系统中,默认每个模块都是封闭的,所以实际上在模块顶层使用var定义的变量是模块作用域,而不是全局的。要定义全局变量,必须显式地将其赋值给global的属性)。 3. 使用全局控制台对象:console也是global对象的属性。 4. 使用__filename和__dirname:这两个变量在每个模块中都是可用的,它们表示当前模块的文件名和目录名。 5. process对象:process对象也是global对象的一个属性,它提供了当前Node.js进程的信息和控制。 但是,根据引用[4]:在Node.js中,不可能在最外层定义变量成为全局变量,因为所有用户代码都属于当前模块。所以,要定义全局变量,必须显式地将其赋值给global的属性。 下面我们给出具体例子: ### 例子1:使用global定义全局变量 ```javascript // 在a.js中 global.myApp = { name: 'My Node Application', version: '1.0.0' }; // 在b.js中(同一个进程内) console.log(global.myApp.name); // 输出: 'My Node Application' ``` ### 例子2:使用全局定时器 ```javascript // 设置一个定时器,2秒后执行 setTimeout(() => { console.log('Timeout after 2000ms'); }, 2000); // 设置一个间隔定时器,每隔1秒执行一次 let count = 0; const intervalId = setInterval(() => { console.log(`Interval count: ${++count}`); if (count >= 5) { clearInterval(intervalId); // 清除定时器 } }, 1000); ``` ### 例子3:使用console ```javascript console.log('This is a log message'); console.error('This is an error message'); ``` ### 例子4:使用__filename和__dirname ```javascript console.log('Current file path:', __filename); console.log('Current directory:', __dirname); ``` ### 例子5:使用process对象 ```javascript // 打印当前工作目录(注意:不是__dirname,__dirname是模块所在目录,而process.cwd()是进程启动的目录) console.log('Current working directory:', process.cwd()); // 打印环境变量 console.log('PATH:', process.env.PATH); // 打印Node.js版本 console.log('Node version:', process.version); ``` ### 例子6:在全局作用域中访问global对象的属性 ```javascript // 由于console是global的属性,所以以下两种方式等价 global.console.log('via global'); console.log('directly'); ``` ### 注意事项: - 在Node.js中,通常不建议过多使用全局变量,因为它会导致模块之间的隐式耦合,使得代码难以维护和测试。 - 在模块中,使用var、let或const定义的变量都是模块作用域的,不会成为global的属性。 根据引用[3],我们还知道Node.js中有setImmediate和process.nextTick,它们也与事件循环相关,但这里我们主要关注global对象。 ### 完整示例代码: ```javascript // 设置全局变量 global.sharedData = 'I am global'; // 使用定时器 setTimeout(() => { console.log(sharedData); // 可以访问全局变量 }, 1000); // 打印模块信息 console.log('File: ' + __filename); console.log('Dir: ' + __dirname); // 使用process console.log('Process ID: ' + process.pid); ``` 以上代码展示了global对象的一些常见用法。 ### 相关问题: 1. global对象和浏览器中的window对象有什么主要区别? 2. 在Node.js中,为什么定义变量不会自动成为全局变量? 3. 如何避免在Node.js中滥用全局变量? 4. process对象还有哪些常用方法? 5. 在Node.js中,如何正确使用定时器? 希望这些例子对您有帮助![^1][^2][^3][^4] </think> ### Node.js 全局对象 global 使用示例 在 Node.js 中,`global` 对象是顶级命名空间,类似于浏览器中的 `window` 对象。以下是核心使用示例: #### 1. 全局变量定义与访问 ```javascript // 定义全局变量 global.appName = "MyNodeApp"; // 在任何模块中访问 console.log(global.appName); // "MyNodeApp" ``` #### 2. 使用全局定时器方法 ```javascript // setTimeout (延迟执行) global.setTimeout(() => { console.log("2秒后执行"); // [^1] }, 2000); // setInterval (循环执行) const timer = global.setInterval(() => { console.log("每秒执行"); // [^1] }, 1000); // 清除定时器 global.setTimeout(() => { global.clearInterval(timer); }, 5000); ``` #### 3. 全局模块信息获取 ```javascript // 当前文件路径 console.log(global.__filename); // /project/app.js [^2] // 当前目录路径 console.log(global.__dirname); // /project [^2] ``` #### 4. 进程信息访问 ```javascript // Node.js 版本 console.log(global.process.version); // v18.x.x [^2] // 运行平台 console.log(global.process.platform); // linux/win32/darwin [^2] // 环境变量 console.log(global.process.env.NODE_ENV); // development ``` #### 5. 全局函数定义 ```javascript // 定义全局工具函数 global.formatDate = (date) => { return new Date(date).toISOString(); }; // 任何模块调用 console.log(global.formatDate("2023-01-01")); // 2023-01-01T00:00:00.000Z ``` #### 6. 全局对象扩展 ```javascript // 添加全局配置对象 global.config = { apiUrl: "https://api.example.com", timeout: 5000 }; // 模块中使用 fetch(global.config.apiUrl, { timeout: global.config.timeout }); ``` ### 重要注意事项: 1. **避免污染全局空间** ```javascript // 不推荐:隐式创建全局变量 appVersion = "1.0"; // 成为 global.appVersion // 推荐:显式声明 global.appVersion = "1.0"; ``` 2. **模块作用域隔离** ```javascript // a.js global.shared = "value"; // b.js console.log(global.shared); // "value" (跨模块共享) ``` 3. **与浏览器差异** ```javascript // 浏览器中 window === globalThis // true // Node.js中 global === globalThis // true ``` 4. **替代方案** 对于配置共享,建议使用专用模块而非全局对象: ```javascript // config.js module.exports = { apiKey: "secret" }; // app.js const config = require('./config'); ``` > 最佳实践:全局对象应仅用于框架级工具和进程级共享数据,常规开发建议使用模块作用域。[^1][^2][^4] ### 完整示例 ```javascript // 初始化全局对象 global.App = { version: "1.0.0", startTime: Date.now(), utils: { log: (msg) => console.log(`[APP] ${msg}`) } }; // 使用示例 App.utils.log("应用启动"); setTimeout(() => { const uptime = (Date.now() - App.startTime)/1000; App.utils.log(`运行时长: ${uptime}秒`); }, 3000); ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值