背景:

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

欢迎试用,提出宝贵意见,如果对你有帮助请帮忙转发此文章~

怎么做一个定时消息提醒_如何用Nodejs编写一个定时消息提醒应用?相关推荐

  1. node.js 没有转发_如何用Nodejs编写一个定时消息提醒应用?

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

  2. 用java编写一个故事的程序_使用Java怎么编写一个递归程序

    使用Java怎么编写一个递归程序 发布时间:2021-02-20 16:05:44 来源:亿速云 阅读:52 作者:Leah 这篇文章将为大家详细讲解有关使用Java怎么编写一个递归程序,文章内容质量 ...

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

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

  4. 用java编写一个简易功能画板_用Java语言编写一个简易画板

    讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...

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

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

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

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

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

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

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

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

  9. java怎么实现日程提醒_如何用java和xml实现日程提醒

    [[[xml中不是写db连接,而是db连接的信息. 连接还是要在java代码里头实现的]]]] 你是不是没有用到框架,比如struts,spring.. 而是直接的jsp servlet? xml文件 ...

最新文章

  1. apache 查看本地页面_GeoSever的页面实现
  2. java线程的cancel_多线程-Cancel详解
  3. c语言第一章考试题及答案,C语言考试题库及答案整理版.doc
  4. 高中毕业 84 岁奶奶自学编程受邀参加 WWDC,人生从来没有太晚!
  5. Shell中各种括号的作用:()、(())、[]、[[]]、{}、>、>>、$()、${}
  6. 试读《JavaScript语言精粹(修订版)》
  7. 【黑金视频连载】NIOS II视频教程正式连载了!!!!!!!!
  8. 码农谷 找出N之内的所有完数
  9. Web开发之Servlet
  10. 抽样:理论与应用(第二版) 金勇进 课程笔记 1~4章
  11. 自己搭建虚拟服务器,如何自己搭建虚拟主机
  12. SOPC Builder failed to refresh PTF file
  13. CDGA|数据虚拟化助力数据治理成效显著
  14. 阿里成立达摩院,三年投入超千亿
  15. acp 适应性领导_什么是适应性领导?
  16. 全面的关于OLAP数仓总结
  17. 企业安全风险的来源有哪些?
  18. 【基于ECharts 数据可视化展示相关配置表全】
  19. 【Excel 2013 数据透视表 学习】一、创建数据透视表
  20. 金融产品的不可能三角:收益性、风险性、流动性

热门文章

  1. 详解CorelDRAW中如何合并与拆分对象
  2. POJ 3264 Balanced Lineup 【线段树】
  3. Java三大框架之——Hibernate关联映射与级联操作
  4. svn: E180001: Unable to open an ra_local session to URL问题解决方案
  5. Coursera 机器学习笔记(五)
  6. 唐中印 项目管理实战专家简介
  7. linux下使用ThinkPHP注意大小写问题
  8. 向右挪一个键位使密码好记又安全
  9. NET防SQL注入方法
  10. 如何获取独立项目开发经验