Nodejs写一个简单的监听服务器程序

前言

刚开始学习nodejs,边看书边敲代码,写了一个简单的服务器监听程序,希望能对Node新手有帮助,OK,进入正文。
程序的功能很简单,监听某个服务器,如果服务器无法访问则发邮件和短信通知服务器宕机,如果修复好了发短信通知。
用到的模块或插件

  • node和npm(基础,没有安装的赶紧装一下吧)
  • nodemailer(node发送邮件)
  • alidayu-node(阿里大于短信服务)

开始

首先在node下安装相关服务

npm install nodemailer alidayu --save

新建app.js,引入http模块

var http = require('http');

现在我们要使用node内置的http模块

//为了方便我在自己电脑使用node起了一个端口3000的本地服务
var options = {
    hostname: 'localhost',//这里可以填入你要监控的服务器url
    port: '3000',
    path: '/',
    method: 'GET'
};

var addcheck = true;//定义一个开关
http.request(options,function(){
     //发送邮件的代码
})
//当请求网站返回错误,也就是网站不可访问时的处理代码
http.on('error',function(){
      
})

邮件功能

基础搭建好了,我们要开始填充发送邮件的代码了.首先使用nodemailer配置客户端。这里以QQ邮箱为例

//引入模块
var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service:'qq',
    auth:{
        user:'xxxxxxx@qq.com',
        pass:'xxxxxxxxxxx'  //这里的pass不是你的QQ邮箱登录密码,而是第三方授权码
    }
});
//定义服务器宕机和恢复时要发送的邮件格式
var errorOptions = {
    from: 'xxxxxxx@qq.com',
    to: 'xxxxxxx@163.com',
    subject:'工程挂掉了',
    text: '工程挂掉了,请尽快修复'
}
var restartOptions = {
    from: 'xxxxxxx@qq.com',
    to: 'xxxxxxxx@163.com',
    subject:'工程恢复',
    text:'服务器已恢复'
}

更多配置请参考nodemailer文档

现在我们要在上面http模块的基础上添加发送邮件功能了

var addcheck = true;//定义一个开关
http.request(options,function(){
    if(!addcheck){
            //发送邮件的代码
            transporter.sendMail(restartOptions,function(){
                    //回调函数
            })
            addcheck = true;
    }
})
//当请求网站返回错误,也就是网站不可访问时的处理代码
http.on('error',function(){
      if(addcheck){
            transporter.sendMail(errorOptions,function(){
                    //回调函数
            });
            addcheck = false;
      }
})

上面代码的意思是首先定义开关,然后用http去监听我们配置好的服务器设置,如果error,同时addcheck为true时,调用nodemailer发送宕机邮件,同时addcheck为false.
如果监听恢复正常,同时addcheck为false(也就是说当前服务器已经宕机一次),则发送恢复邮件通知服务器已经正常。同时addcheck为true.

短信服务

短信接口我们调用阿里大于的nodejs短信接口,alidayu-node模块简介
首先我们登陆阿里大于,申请应用,拿到App Key和 App Secret以及相关的接口。

App key和App Secret


Paste_Image.png

短信签名


Paste_Image.png

短信通知模板ID


Paste_Image.png

上面我们已经安装了alidayu-node模块,直接引入

var App = require('alidayu-node');
var app = new App('App Key','App Secret');//这里的App Key和App Secret 就是我们上面拿到的

app.smsSend({
        sms_free_sign_name: '通知',//这里就是上面的签名
        sms_param: {"code": "123456", "product": "测试网站"},//这里是短信模板变量,可选
        rec_num: '13599999999',//要发送的手机号,可以有多个
        sms_template_code: 'SMS_640004'//短信模板ID
})

OK,将我们上面写好的短信通知代码段放到http代码段下,同时我们使用setInterval去重复调用

var timer = setInterval(function(){
    var req = http.request(options,function(res){
                if(!addCheck){
                    transporter.sendMail(restartOption,function(err,res){
                        if(err){
                            console.log(err);
                        }
                        else{
                            console.log(req.messageId);
                        }
                        addCheck = true;
                    })
                }
                console.log(res.statusCode);
            })

    req.on('error',function(err){
                if(addCheck){
                    transporter.sendMail(errorOptions,function(){
                        console.log(new Date() + '工程挂掉了');
                    });
                    app.smsSend({
                            sms_free_sign_name:'通知',
                            rec_num:'13999999999',
                            sms_template_code:'SMS_42675072'
                        },function(err,res){
                         //回调,可选,我这里方便调试加了回调
                            if(err){
                                console.log(err);
                            }
                            else{
                                console.log(res);
                            }
                        });
                    addCheck = false;
                }
            })

    req.end();
},60000);

然后在shell中启动,测试代码是否能正常工作

node app.js

如果我们部署在服务器上,关掉终端那么服务也就停止了,这里我们可以使用PM2进程管理软件来不间断启动服务。关于PM2的介绍

参考

通过阿里大鱼平台用nodejs发短信
史上最“脑残”的“抢火车票”程序(node.js版)

正文结束,第一次在简书写文章,心情有点小激动(hiahia)。文章若有错误之处,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,416评论 0 6
  • 2017.7.25---8.3日,跟着一群孩子和他们的导师,北游鄂尔多斯,借名庄子外篇曰知北游。路途杂记,...
    圣诞来了天使阅读 1,992评论 8 19
  • 我的父亲 @黄开兵 一说起自己的父亲,很多人都会想到这些词:慈祥,严肃,憨厚,一家之主,顶梁柱……而对于我来说,都...
    黄开兵阅读 962评论 5 13
  • 最近读了本有趣的书,台湾作家骆以军的《小儿子》。作家有两个性格迥异的儿子,而书名“小儿子”并不是单指第二个儿子,英...
    加加妈妈阅读 837评论 1 4