node.js 没有转发_如何用Nodejs编写一个定时消息提醒应用?
背景:
同事告诉我最近一段时间每天上班长时间盯着屏幕工作经常眼睛疼,问我有没有好用定时提醒功能。我受到启发,决定用nodejs来实现一个定时提醒应用。
需求分析:
同事是个程序员,熟悉命令行操作,这样我就可以忽略用户界面了。只要着重实现几个个核心功能点就行。例如:创建消息提醒计划,管理计划等。拆解一下需求,实现这些功能点我会用到【消息提醒】【定时计划】【常驻系统后台】【封装成 node package】。分析的差不多了,接下来就可以准备着手细化实现方案了。
关于消息提醒:
node-notifier 是一个node package,支持发送跨平台【macOS , win, Linux】的native notifications。示例代码:
const notifier = require('node-notifier');// Stringnotifier.notify('Message'); Objectnotifier.notify({ title: 'My notification', message: 'Hello, there!'});
macOS演示效果:
关于定时计划
node-schedule 是一个处理任务调度的package,可以让任务按照指定的时间周期计划来执行。指定时间周期的方式和cron类似。如下为周期指定的方法:
* * * * * *┬ ┬ ┬ ┬ ┬ ┬│ │ │ │ │ ││ │ │ │ │ └ 周几(0 - 7)(0 或 7 是周日)│ │ │ │ └───── 月(1 - 12)│ │ │ └────────── 日(1 - 31)│ │ └─────────────── 小时(0 - 23)│ └──────────────────── 分钟(0 - 59)└───────────────────────── 秒(0 - 59, 可选)
node-schedule代码示例:
const schedule = require('node-schedule');schedule.scheduleJob('0 0 9-18 * * 1-5', function () {//周一到周五9-18点每小时0分0秒执行任务})
关于常驻系统后台:
想要让程序一直监听schedule,就要在系统中开启一个常驻的nodejs进程。利用nodejs自带的child_process 模块创建node子进程。其他的守护进程包也都是通过child_process来实现的例如:foreverjs,PM2等。
示例代码up.js:
const { spawn } = require('child_process');const path = require('path');const { exit } = require('process');// 开启node子进程let child = spawn('node', [path.join(__dirname, 'task.js'), options.rule])// 退出父进程exit();
开启进程之后可以在活动监视器查看到,如图所示:
接下来要完成命令交互部分,命令行交互用到是的commanderjs这个package。使用它我们可以快速实现命令交互的功能。代码示例 up:
#!/usr/bin/env nodeconst { exec, spawn } = require('child_process');const { exit } = require('process');const program = require('commander');var fs = require('fs');const kill = require('tree-kill');const path = require('path');const log_file = path.join(__dirname, 'log.txt')const stop = program.command('stop');stop.action(() => { let pids = fs.readFileSync(log_file).toString().trim() if (pids.length != 0) { pids.split('').forEach(function (pid) { if (pid.length > 0) { kill(pid) fs.writeFile(log_file, '', function () { }) } }) console.log('⏰提醒已经关闭') } else { console.log("⚠️没有发现任何计划") }})const start = program.command('start')start.requiredOption('-r, --rule ', '填写一个消息提醒规则例如:*/30 * * * * *') .action(function (options) { try { let child = spawn('node', [path.join(__dirname, 'task.js'), options.rule]) fs.open(log_file, 'a+', function (err, fd) { fs.write(fd, child.pid + "", function () { }); exit(); }); console.log(`✅任务创建成功,执行频率${options.rule}`); } catch (e) { console.error('spawn ERROR !!'); console.error(e); } })program.parse(process.argv);
到此位置功能已经基本实现了,我已经把package发布到了npm和Github(目前支持macOS,其他平台还没有测试)。
安装:
npm i standup-workday -g
开启消息定时提醒命令:
up start -r "*/10 * * * * *"
关闭:
up stop
视频演示地址:https://www.ixigua.com/6864153350209241607/
欢迎试用,提出宝贵意见,如果对你有帮助请帮忙转发此文章~
node.js 没有转发_如何用Nodejs编写一个定时消息提醒应用?相关推荐
- 怎么做一个定时消息提醒_如何用Nodejs编写一个定时消息提醒应用?
背景: 同事告诉我最近一段时间每天上班长时间盯着屏幕工作经常眼睛疼,问我有没有好用定时提醒功能.我受到启发,决定用nodejs来实现一个定时提醒应用. 需求分析: 同事是个程序员,熟悉命令行操作,这样 ...
- python编程代码画画_如何用python编写一个绘制马赛克图像的自写程序
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 这篇教程将会展示如何用python的图形化包"Pygame"和基础的文件I/O来创建一 ...
- 关于点名的简单python编程_如何用python编写一个简易的随机点名软件
匿名用户 1级 2018-05-30 回答 思路:1.定义一个字典,把名字和数字对应起来:2.引用随机模块:3.输入要点名的个数,通过循环输出名字. 具体代码如下: # -*- coding:utf- ...
- java 设计连连看_如何用JAVA 编写一个连连看游戏全程设计
展开全部 刚试了..测试通过.. importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclass LianLian ...
- 怎么用python制作随机点名软件_如何用python编写一个简易的随机点名软件?
自问自答哈哈,高铁上随便写的代码 不过randint那里debug好像要(0, 3)不知道是什么原因 import random my_list = ['张三', '李四', '王五', '杨六'] ...
- 怎么用python制作随机点名软件_如何用python编写一个简易的随机点名软件
展开全部 思路:1.定义一个字2113典,把名字和数字对应起5261来:2.引用随机4102模块:3.输入要点名的个数1653,通过循环输出名字. 具体代码如下:# -*- coding:utf-8 ...
- 利用python写时钟程序_如何用python编写一个番茄钟程序
今天,我们尝试用python来编写一个简单的PC端番茄钟,需要实现的功能如下:启动时"滴"一声并询问:"休息时间结束!是否开始一个新的番茄钟?" 如果用户点击& ...
- python实现md5加密_如何用Python编写一个MD5加密和解密代码
PythonMD5加密程序 # coding:utf-8 import hashlib md5 = hashlib.md5() # 应用MD5算法 data = input("请输入 ...
- python能写什么脚本_如何用python编写一个阴阳师脚本(自动刷御魂,业原火)(2)...
在上一篇文章里,我们已经安装好了python,安装好了所有需要的库,现在可以开始码代码了嗷 先让我们来分析一下需要实现的脚本功能,首先就是这个开始战斗此时队友还没来... 当队友(舍友)进来时,开始战 ...
最新文章
- linux oracle 关闭防火墙,Linux 下关闭防火墙设置
- 在python3环境安装builtwith模块
- python 循环(while、for、break、continue、循环嵌套、while...else、for...else)
- 我的职业发展目标计算机作文,作文《我的职业发展目标》1000字
- 《JAVA与模式》之装饰模式
- eclipse远程开发
- mysql5.7.11源码安装_MySQL5.7.10最新版本源代码安装详细过程_MySQL
- PAT (Basic Level) Practice (中文)1005 继续(3n+1)猜想 (25 分)
- How is SCM product maintenance tcode redirecting access to MARA
- Distinct Characters Queries CodeForces - 1234D(线段树求区间字母种类数)
- 【DevOps进行时】C/S端界面自动化测试:微软UIAutomation实践
- core微型计算机,UPC-CHT01 | 专业创客微型计算机板_UP Core - AAEON
- 如何学习-我是这样学JS理论![不看后悔篇]
- SpringCloudAlibabaSentinel入门教程
- java和C#的区别汇总
- 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法
- 流程图里的形状符号的代表意义
- golang中的URL 的编码和解码(转)
- 计算机win10无法打开小键盘,win10数字小键盘开机不启动解决方法
- android 新浪微博分享链接地址,Android 集成新浪微博分享及授权 (上)
热门文章
- 调用远程摄像头进行人脸识别_人脸识别技术植入手机APP
- 与虫子尾交3d动画网站_PPT中最酷的效果 —— 3D模型全解
- 机器学习笔记:auto encoder
- 文巾解题 679. 24 点游戏
- MATLAB table数据结构 首篇
- 补贴背后的商业竞争,你真的懂吗?
- 内容社区,为什么有必要做内容标签系统?
- c++求解自行车慢速比赛问题_一元一次方程应用专题,十大题型(包括数轴上动点问题)...
- amoeba高可用mysql_amoeba for mysql 使用说明
- sql 时间范围查询_Excel中使用SQL查询,单元格范围最多支持65536行?