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编写一个定时消息提醒应用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 中watch函数名_vue中避免
- 下一篇: 中过滤记录中时间_除尘滤芯如何在过滤行业