1

背景

最近项目上不太忙,决定利用这难得的空闲时间把之前一直看的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搭建一个简单的服务,在页面上提交表单来修改发送内容,也可以提供页面来直接发送消息而不用等轮序。。。

那就是下一个文章的内容了。。。


紫日残月
239 声望8 粉丝