背景
最近项目上不太忙,决定利用这难得的空闲时间把之前一直看的nodeJs充分利用下,于是打算写一个钉钉机器人项目,在每天指定的时间来提醒一些事项。
代码逻辑
说干就干,怎么申请并向群里添加机器人之类的就不赘述了,有心的可以百度或参考官方教程。整个代码的逻辑很简单:使用superagent作为代理来发起请求,在指定的时间里调用接口发送消息就可以了。
因为本身是一个node小白,所以还是踩了不少坑的。。。
最开始使用setinterval函数来处理每天的定时发送,又因为只需要工作日发送,有需要调用第三方接口来判断当前日期是否为工作日。 用setInterval接口又需要一直去轮训判断小时和分钟是否符合预定义的时间,感觉有点傻。。。
一下是原始判断时间的代码:
function isTimeNow() {
let text = '';
const now = moment();
const hour = now.hour();
const minute = now.minute();
logger.info(`当前是当天的第${hour}个小时`);
if (hour === 9 && minute > 10 && minute < 20) { // 9:10 -- 9:20 之间
text = '上班了,别忘记打卡了..';
} else if (hour === 18 && minute > 30 && minute < 40) { // 6:30-6:40 之间
text = '下班了,别忘记打卡了..';
}
logger.info(`需要发送的消息内容为: ${text}`);
if (text) {
sendMsg(text, webhock);
}
}
还可以优化
之前用过java来使用corn去执行定时任务,想着node也应该是支持的,搜索后发现,果不其然,发现了node-schedule库就是一个支持corn来执行定时任务。果断抛弃setInterval。 这样一来代码就省去了大量判断时间的代码,直接初始化一个任务,一行搞定:
schedule.scheduleJob('00 30 9 * * *', doSchedule);
怎么失败了
ok,到此为止,代码基本完成, 接下来就是去部署执行了,首先在本地终端使用node去执行脚本,群里果然收到消息,一切正常,完美! 顺利部署到云端(腾讯云),也正常收到消息,简直完美!!可以去溜达一圈了?
溜达一圈回来后,悲剧了,本来轮序的消息,怎么轮序了一段时间后没有了? 服务器关掉了? 被人黑掉了?
鉴于这个项目的价值,被人黑掉的可能性基本不存在,腾讯云一般应该不会死掉。。。有个著名的小学生说过:排除一切可能后,最不可能的就是真相。 真相是残酷的:出bug了。。。
调bug吧,调了半天发现没问题,看进程,发现腾讯云远程在一段时间后会自动断开连接,再次连接上后原来的进程就被关掉了。。。。
搜索后发现,原来进程还有后台和前台之分(又涨姿势了)。在终端里执行的命令,在终端关闭后也就关闭了。 要想不关闭,是不能简简单单使用node命令的。。。
问题明白了,解决起来很快的,在终端执行以下命令:
node index.js & // 启动后台基础
disown // 前置转为后台进程
ps -ax: 查看所有进程信息
ps -f -C node: 查看node信息
不足之处
暂时这个东西是满足需求了。但因为所有提示信息都是写死的,如果有时候想调整信息内容怎么办?
下一步可以把发送的消息内容放在一个json文件里, 使用express搭建一个简单的服务,在页面上提交表单来修改发送内容,也可以提供页面来直接发送消息而不用等轮序。。。
那就是下一个文章的内容了。。。