背景:

同事告诉我最近一段时间每天上班长时间盯着屏幕工作经常眼睛疼,问我有没有好用定时提醒功能。我受到启发,决定用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编写一个定时消息提醒应用?相关推荐

  1. 怎么做一个定时消息提醒_如何用Nodejs编写一个定时消息提醒应用?

    背景: 同事告诉我最近一段时间每天上班长时间盯着屏幕工作经常眼睛疼,问我有没有好用定时提醒功能.我受到启发,决定用nodejs来实现一个定时提醒应用. 需求分析: 同事是个程序员,熟悉命令行操作,这样 ...

  2. python编程代码画画_如何用python编写一个绘制马赛克图像的自写程序

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 这篇教程将会展示如何用python的图形化包"Pygame"和基础的文件I/O来创建一 ...

  3. 关于点名的简单python编程_如何用python编写一个简易的随机点名软件

    匿名用户 1级 2018-05-30 回答 思路:1.定义一个字典,把名字和数字对应起来:2.引用随机模块:3.输入要点名的个数,通过循环输出名字. 具体代码如下: # -*- coding:utf- ...

  4. java 设计连连看_如何用JAVA 编写一个连连看游戏全程设计

    展开全部 刚试了..测试通过.. importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclass LianLian ...

  5. 怎么用python制作随机点名软件_如何用python编写一个简易的随机点名软件?

    自问自答哈哈,高铁上随便写的代码 不过randint那里debug好像要(0, 3)不知道是什么原因 import random my_list = ['张三', '李四', '王五', '杨六'] ...

  6. 怎么用python制作随机点名软件_如何用python编写一个简易的随机点名软件

    展开全部 思路:1.定义一个字2113典,把名字和数字对应起5261来:2.引用随机4102模块:3.输入要点名的个数1653,通过循环输出名字. 具体代码如下:# -*- coding:utf-8 ...

  7. 利用python写时钟程序_如何用python编写一个番茄钟程序

    今天,我们尝试用python来编写一个简单的PC端番茄钟,需要实现的功能如下:启动时"滴"一声并询问:"休息时间结束!是否开始一个新的番茄钟?" 如果用户点击& ...

  8. python实现md5加密_如何用Python编写一个MD5加密和解密代码

    PythonMD5加密程序 # coding:utf-8 import hashlib md5 = hashlib.md5()     # 应用MD5算法 data = input("请输入 ...

  9. python能写什么脚本_如何用python编写一个阴阳师脚本(自动刷御魂,业原火)(2)...

    在上一篇文章里,我们已经安装好了python,安装好了所有需要的库,现在可以开始码代码了嗷 先让我们来分析一下需要实现的脚本功能,首先就是这个开始战斗此时队友还没来... 当队友(舍友)进来时,开始战 ...

最新文章

  1. linux oracle 关闭防火墙,Linux 下关闭防火墙设置
  2. 在python3环境安装builtwith模块
  3. python 循环(while、for、break、continue、循环嵌套、while...else、for...else)
  4. 我的职业发展目标计算机作文,作文《我的职业发展目标》1000字
  5. 《JAVA与模式》之装饰模式
  6. eclipse远程开发
  7. mysql5.7.11源码安装_MySQL5.7.10最新版本源代码安装详细过程_MySQL
  8. PAT (Basic Level) Practice (中文)1005 继续(3n+1)猜想 (25 分)
  9. How is SCM product maintenance tcode redirecting access to MARA
  10. Distinct Characters Queries CodeForces - 1234D(线段树求区间字母种类数)
  11. 【DevOps进行时】C/S端界面自动化测试:微软UIAutomation实践
  12. core微型计算机,UPC-CHT01 | 专业创客微型计算机板_UP Core - AAEON
  13. 如何学习-我是这样学JS理论![不看后悔篇]
  14. SpringCloudAlibabaSentinel入门教程
  15. java和C#的区别汇总
  16. 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法
  17. 流程图里的形状符号的代表意义
  18. golang中的URL 的编码和解码(转)
  19. 计算机win10无法打开小键盘,win10数字小键盘开机不启动解决方法
  20. android 新浪微博分享链接地址,Android 集成新浪微博分享及授权 (上)

热门文章

  1. 调用远程摄像头进行人脸识别_人脸识别技术植入手机APP
  2. 与虫子尾交3d动画网站_PPT中最酷的效果 —— 3D模型全解
  3. 机器学习笔记:auto encoder
  4. 文巾解题 679. 24 点游戏
  5. MATLAB table数据结构 首篇
  6. 补贴背后的商业竞争,你真的懂吗?
  7. 内容社区,为什么有必要做内容标签系统?
  8. c++求解自行车慢速比赛问题_一元一次方程应用专题,十大题型(包括数轴上动点问题)...
  9. amoeba高可用mysql_amoeba for mysql 使用说明
  10. sql 时间范围查询_Excel中使用SQL查询,单元格范围最多支持65536行?